python - 如何修改此 REGEX 以获取测试字符串中的所有日期

标签 python regex date

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/

相关文章:

python - 如何在基于类的 View 中进行排序

javascript - 如何通过 JavaScript 中的正则表达式将 camelCase 更改为 slug-case(或 kebab-case)

ios - Objective-C 中的正则表达式

javascript - 如何填充第一个日期和最后一个日期之间的日期?

ruby-on-rails - 以美国格式: mm/dd/yyyy提交日期

python - 如何堆叠两个numpy数组的每n行

python - 如何在 Python 的 SciPy 中删除稀疏矩阵中的小元素?

python - 控制Python进程的好方法

javascript - 接受除 5 个连续零以外的所有数字 : Javascript

java - Java中奇怪的日期解析