test_string = '''dated as of October 17, 2012 when we went caroling, dated as of December 21, 2011 when we ate bananas'''
import re
import calendar
months_full = '|'.join([month for month in calendar.month_name][1:])
pattern_1 = r'\b' + months_full + r'\s+\d{1,2},?\s+\d{4},?'
test_pattern = re.compile(pattern_1)
x = test_pattern.findall(test_string)
print x
>>>
['October', 'December 21, 2011']
>>>
我认为我的正则表达式在问
从单词边界开始
查找任意月份(拼写正确且大写字母正确)
接下来要求有一个或多个空格
后跟 1 或 2 位数字
接下来可能有一个或零个逗号
后跟一个或多个空格
那么应该有4位数字
它可能以紧邻最后一个数字的逗号结尾
一旦我得到日期,我打算验证它们,这样我就不会太担心这个案子
2999 年 1 月 1 日朗姆酒箱,我可以检查该日期是否在有效范围内。
我确实发现,当我用十二月替换第一个月时,正则表达式会返回两个日期。我玩过 \b 。和其他变化,但似乎无法克服这一点。
任何意见将不胜感激
您的模式不起作用,因为您忘记将月份名称的交替放在非捕获组中(?:...)
另一条通知:
当您可以编写它们并优化您的模式时,加载一个只有英文月份名称的模块是一种耻辱!例子:
pattern_1 = r'\b(?:(?:jan|febr)uary|ma(?:y|rch)|ju(?:ne|ly)|a(?:pril|ugust)|(?:octo|(?:sept|nov|dec)em)ber)\s+[0-9]{1,2},?\s+[0-9]{4},?'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)