我在下面的正则表达式匹配中做错了什么
>>> import re
>>> d="30-12-2001"
>>> re.findall(r"\b[1-31][/-:][1-12][/-:][1981-2011]\b",d)
[]
请您参考如下方法:
[1-31] 匹配 1-3 和 1,它基本上是 1、2 或 3。您不能匹配数字范围除非它是 0-9 的子集。这同样适用于 [1981-2011],它恰好匹配一个字符,即 0、1、2、8 或 9。
最好的解决方案是简单地匹配任何 数字,然后使用 python 本身检查数字。诸如 31-02-2012 之类的日期没有任何意义 - 并且很难进行正则表达式检查。让它也正确处理闰年会使它变得更加困难或不可能。这是一个匹配任何看起来像 dd-mm-yyyy 日期的正则表达式:\b\d{1,2}[-/:]\d{1,2}[-/:]\d{4}\b
但是,我强烈建议不要允许 -、: 和 / 中的任何一个,因为 : 通常是用于时间,/ 通常用于美国书写日期的方式 (mm/dd/yyyy) 和 - 用于 ISO 方式 (yyyy-mm-dd)。根本不处理 EU dd.mm.yyyy 语法。
如果字符串只包含日期,则根本不需要正则表达式 - 使用 strptime()相反。
总而言之,告诉用户您期望的日期格式并解析该格式,拒绝其他任何格式。否则你会得到模棱两可的情况,例如 04/05/2012(是 4 月 5 日还是 5 月 4 日?)。
