在 Python 里处理字符串,遇到要找特定格式的内容,很多人第一反应就是用正则表达式。比如你想匹配日期 “2018-03-20” 这样的格式,正则确实是最直接的办法。
我们要匹配的是一个明确格式:年-月-日
这个日期的特点是固定的格式:4位年,2位月,2位日,中间用减号分隔。换句话说,模式应该是 \d{4}-\d{2}-\d{2}。\d 是数字,{4} 表示连续四位。
先给出基本的正则写法:
import re
text = "今天的日期是2018-03-20,明天就是21号了。"
pattern = r"\d{4}-\d{2}-\d{2}"
match = re.search(pattern, text)
if match:
print(match.group())
这段代码可以从任意包含日期的文本中找出一个“年-月-日”格式的日期。如果你要找所有匹配的,换成 re.findall() 即可。
当然,有些细节不能忽视
比如你可能会问,那我能不能把月份写成一位?比如 “2018-3-5”?严格来说这就不匹配上面这个模式了,因为我们明确要求两位数字。想支持这种灵活格式,可以稍微放松规则:
pattern = r"\d{4}-\d{1,2}-\d{1,2}"
这个改法让月和日都支持 1 到 2 位数字,不过这样就引入了另一个问题——合法性没法保证。比如 “2018-99-99” 也是匹配的。
如果你要更严谨,那正则就会变复杂
比如你要确保月份在 01 到 12,日期在 01 到 31,就得写得更细致一点:
pattern = r"(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])"
这段看起来复杂,但其实就是硬编码了月份和日期的合法范围。它不能识别2月是否是28天,也不能识别闰年,不过比单纯的数字匹配已经强不少了。
一个进阶的做法是结合 datetime 模块
因为再强的正则也不如标准库来得稳。你可以用正则先提取出匹配项,再用 datetime.strptime() 去验证它是不是真的日期:
from datetime import datetime
match = re.search(r"\d{4}-\d{2}-\d{2}", text)
if match:
try:
date = datetime.strptime(match.group(), "%Y-%m-%d")
print("合法日期:", date)
except ValueError:
print("非法日期")
这个组合拳比你全靠正则强多了,既能匹配格式,又能验证内容合法。
正则写得对,还得用得巧
说到底,匹配日期是个“形式”和“内容”分离的问题。正则擅长搞定形式,但要保证内容合法,得靠其他模块配合。正则能做的,不一定全得靠它做。
你有没有被那种“正则看着对结果却不对”的情况坑过?尤其是多组括号嵌套的时候,一不留神就匹配错了。写正则就像写 if 语句,越长越容易出事。能拆就拆,能分阶段处理就分阶段。别怕麻烦,结果稳才是关键。
更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!