page contents

python面试题:正则匹配,匹配日期2018-03-20

在 Python 里处理字符串,遇到要找特定格式的内容,很多人第一反应就是用正则表达式。比如你想匹配日期 “2018-03-20” 这样的格式,正则确实是最直接的办法。

attachments-2025-06-wNsrC6xt6840ff2e90e74.png

在 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入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2025-06-05 10:21
  • 阅读 ( 44 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1303 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2140 文章
  3. Pack 1303 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章