如何修复此日期正则表达式,该表达式与不应匹配的内容匹配



我正在尝试扫描一些文档以查找分类问题的日期。 在这里和其他地方阅读后,我构建了以下正则表达式

months='['+'|'.join(calendar.month_abbr[1:])+'|'+'|'.join(calendar.month_name[1:])+']'
techPart='+\.*\s*\d{1,2}[,]?[\s*][1|2]\d{3}'
dateExpr=months+techPart

我正在这个字符串上测试它

newString='Mar. 31, 2011 Dec. 31, 2010 bananas Mar. 31, 2011 too much malarky September 1, 1992 redundant Dec. 31, 2010  September 29, 1999  March 12 2004 ddfd  March.    13 2019 ddfd  Mac.    13 2019 ddfd'

当我像这样运行它时

for date in re.findall(dateExpr,newString):
print date

我明白这个

Mar. 31, 2011
Dec. 31, 2010
Mar. 31, 2011
September 1, 1992
Dec. 31, 2010
September 29, 1999
March 12 2004
March.    13 2019
Mac.    13 2019    #here is my problem

months正则表达式中,您使用方括号,给出类似 [Jan|Feb|Mar|...] 的内容。 这是错误的。方括号用于字符类,并匹配括号中的任何字符之一,因此这将匹配Jan|F等。 相反,您希望使用括号:

months='(?:'+'|'.join(calendar.month_abbr[1:])+'|'+'|'.join(calendar.month_name[1:])+')'

您需要?:,因为findall仅返回捕获的组,因此我们需要将此组标记为非捕获组。

稍后您在正则表达式中遇到了同样的问题,您执行[1|2]. 你想要(?:1|2),或者只是[12]

最新更新