我想提取的日期只能是“ 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月”
答案 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.search
与group(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月的替代方法之后,因为这是您的月份名称的非捕获组。