正则表达式匹配多种日期格式

时间:2018-09-08 22:33:08

标签: regex

我有以下RegEx语句,该语句将以与月,日和年匹配的日期格式(例如2001年1月1日)返回匹配项

[12]\d|3[01]))|\w+\s\d{2},\s\d{4}

我想对其进行修改,以使其包含缩写月份中的匹配项,并且在第二天之后带有或不带有逗号。因此,例如,匹配项将包括以下内容:

Jan 01 2001

Jan 01, 2001

January 01 2001

January 01, 2001

我相信下面的部分内容是我需要的,但是我似乎无法将所有内容放在一起。任何帮助将不胜感激。

(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)

2 个答案:

答案 0 :(得分:2)

您处在正确的轨道上。 需要什么:

  • 将捕获组转换为非捕获组
  • 在单词前后添加单词边界\b
  • 使用(?:0[1-9]|[1-2][0-9]|3[01])匹配数字范围
  • 匹配可选的逗号,?,后跟空格
  • 在字符串^的开头$和结尾处的锚点。

您可以使用:

^\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b (?:0[1-9]|[1-2][0-9]|3[01]),? \d{4}$

正则表达式演示here


如注释中所述,如果需要不区分大小写,请在模式开头添加(?i)选项。如果模式使用较大的字符串,则只需移除锚点:

(?i)\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b (?:0[1-9]|[1-2][0-9]|3[01]),? \d{4}

正则表达式演示here


顺便说一句,对于JuneJuly这样的月份,您可以简单地使用June?July?而不是Jun(?:e)?和{{1} }。

答案 1 :(得分:0)

import re
s = 'Jan 01 2001\nJan 01, 2001\nJanuary 01 2001\nJanuary 01, 2001'
print(s)
>>>Jan 01 2001
>>>Jan 01, 2001
>>>January 01 2001
>>>January 01, 2001

由于一个月的缩写仅是其前3个字母,因此您可以在该月的其余字母中使用[a-z] *。

例如,
(?: Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec)找到“ Jan”,并且
[a-z] * 找到一月份的“ uary”。

re.findall(r'(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* \d{2},?\d{4}',s)
>>>['Jan 01 2001', 'Jan 01, 2001', 'January 01 2001', 'January 01, 2001']