首页 > 解决方案 > python日期正则表达式

问题描述

我试图只将日期添加到我的列表中。

pattern_six = re.compile(r'\d{1,2}-\d{1,2}-\d{4}')

不幸的是,这个正则表达式也出现了#2-1,这不是一个日期。
问题 1:我认为正则表达式只会遵循 XXX 模式,而不是 XX。为什么我的假设是错误的?
问题 2:如何修复我的表达式以正确选择仅日期?我尝试了这个表达式,但失败了。

pattern_six = re.compile(r'[^#](\d{1,2}-\d{1,2}-\d{4})')

提前谢谢你的帮助 :)

标签: pythonregexdate

解决方案


这不是您应该尝试使用正则表达式解决的问题。为什么?请参阅 Jeppe Spanggaard 的回答。这似乎是正确的,但是呢:

>>> re.match("((0[1-9]|[12]\d|3[01])-(0[1-9]|1[0-2])-[12]\d{3})", "31-02-2019")
<_sre.SRE_Match object; span=(0, 10), match='31-02-2019'>

但是 2019 年(或任何其他年份)没有 2 月 31 日!正则表达式处理模式,但日期不仅仅是模式,日期不是数字和破折号。它们要棘手得多(不同月份的天数不同,闰年......)。除非您有充分的理由,否则您应该始终使用库来处理日期(无论您使用什么语言):

>>> from datetime import datetime as dt
>>> dt.strptime("31-02-2019", "%d-%m-%Y")
...
ValueError: day is out of range for month
>>> dt.strptime("28-02-2019", "%d-%m-%Y")
datetime.datetime(2019, 2, 28, 0, 0)

strptime如果要测试字符串是否为所需格式的日期,可以换行:

>>> def to_date(s):
...     try:
...         return dt.strptime(s, "%d-%m-%Y")
...     except ValueError:
...         return None
... 
>>> to_date("31-02-2019") is None
True
>>> to_date("28-02-2019")
datetime.datetime(2019, 2, 28, 0, 0)

推荐阅读