繁体   English   中英

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

[英]Python:how to extract date using regex

我想提取只有特定格式“月日,年”的日期。如果是其他格式,我会跳过它。 我使用了下面的正则表达式函数,但只显示月份而不是日期和年份。 有人可以指出什么是错的

>>> 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日

输出上述代码:“十一月”

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

(?:(?: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日的 闰年 正则表达式可能不适合这个,您必须使用日期/日历来验证您的日期是否有效。

或者使用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

您错过了正则表达式中的右括号。 它将在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月替代之后出现,而不是在模式的最后,因为这是你的月份名称的非捕获组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM