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']
>>>
我想我的正则表达式在问
从单词边界开始
找到任何月份(正确拼写和大写
next要求有一个或多个空格
后跟 1 或 2 位数字
接下来可能有一个或零个逗号
后跟一个或多个空格
那么应该是4位
它可能以紧邻最后一位数字的逗号结尾
一旦我得到日期,我打算验证它们,所以我不太担心这个情况
1 月 1 日,2999 箱朗姆酒,好像我可以检查日期是否在有效范围内。
我确实发现,当我用十二月替换第一个月时,正则表达式会返回两个日期。我玩过\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},?'
关于python - 如何修改此 REGEX 以获取测试字符串中的所有日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008990/