Python:如何使用正则表达式提取日期

时间:2018-12-26 06:59:10

标签: python regex

我想提取的日期只能是“ Month day,year”的特定格式。如果是其他任何格式,我将跳过它。 我使用了以下正则表达式功能,但是只显示月份而不显示日期和年份。有人可以指出出什么问题

>>> date_pattern="(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May?|June?
|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?\
s+\d{2},\s+\d{4})"

s = "the date is November 15, 2009"
print(re.findall(date_pattern,s))

预期输出:2009年11月15日

上述代码的输出:“ 11月”

3 个答案:

答案 0 :(得分:1)

您可以将正则表达式更改为:

(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May?|June?|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{2},\s+\d{4})

说明:

您当前的正则表达式接受此处详述的模式:

演示: https://regex101.com/r/0teiAB/3

如果您不添加括号,则正则表达式将接受定义的月份之一或Dec(?:ember)?)\s+\d{2},\s+\d{4})-12月/ 12月,然后是日期和年份

演示: https://regex101.com/r/0teiAB/1

其他说明:

  • 在几天中,\d{2}也将接受33,99,00,这不是适当的日历天!!! ->您可以用 (?:0?[1-9]|[1-2][0-9]|30|31)来限制范围,如下所示:

演示: https://regex101.com/r/NTIyf7/1

  • 如果您想限制每月的最大天数(例如,没有2月31日),这还不够,如果要达到该精度级别,则需要更改正则表达式并使用与我在此处介绍的每个月的限制类似。

  • 最后但并非最不重要的一点,如果您走得更远并且想在 2月29日中定义 le年。正则表达式可能不是正确的工具,您将不得不使用日期/日历来验证您的日期是否有效。

答案 1 :(得分:1)

或将re.searchgroup(0)一起使用:

>>> date_pattern='(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s+\d{1,2},\s+\d{4}'
>>> s = "the date is November 15, 2009"
>>> re.search(date_pattern,s).group(0)
'November 15, 2009'
>>> 

访问我为此创建的regex101

答案 2 :(得分:1)

您错过了正则表达式模式中的右括号。应该在12月之后完成非捕获组。

(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June|July|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{2},\s+\d{4}

编辑:实际上,括号的位置不正确。而不是放在模式的结尾,它应该出现在12月的替代方法之后,因为这是您的月份名称的非捕获组。