python - 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})')
提前谢谢你的帮助 :)
解决方案
这不是您应该尝试使用正则表达式解决的问题。为什么?请参阅 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)
推荐阅读
- phpunit - 使用 PHPUnit 断言进行 Behat 测试
- flutter - 为小部件树中的所有容器分配相同的 BoxDecoration 值
- python - 在这种情况下如何定位元素?
- javascript - 对自己的消息做出反应的 Discord 机器人
- java - Android Studio Google Map 应用程序不再显示地图
- angular - 如何知道何时完成工作 takeUntil
- c# - Azure 函数计时器触发器
- apache-spark - Pyspark ALS 推荐错误:“要求失败:没有可用的评级”
- python - 查看散景图形对象的 x_range 属性?
- python - Pythonic 计算可降水量的方法?