我在下面的正则表达式匹配中做错了什么
>>> import re
>>> d="30-12-2001"
>>> re.findall(r"\b[1-31][/-:][1-12][/-:][1981-2011]\b",d)
[]
Run Code Online (Sandbox Code Playgroud)
[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).欧盟dd.mm.yyyy语法根本没有处理.
如果字符串不包含除日期之外的任何内容,则根本不需要正则表达式 - 请strptime()改用.
总而言之,告诉用户您期望的日期格式并解析该日期格式,拒绝其他任何内容.否则你会得到一些模棱两可的案例,如04/05/2012(是5月5日还是4日?).