【问题标题】:Regex to match date like month name day comma and year正则表达式匹配日期,如月份名称、日期逗号和年份
【发布时间】:2016-02-15 15:58:43
【问题描述】:

我想知道如何匹配“2014 年 10 月 21 日”或“2014 年 10 月 21 日”这样的日期

到目前为止我所做的是\b(?:Jan?|?:Feb?|?:Mar?|?:Apr?|?:May?|?:Jun?|?:Jul?|?:Aug?|?:Sep?|?:Oct?|?:Nov?|?:Dec?) [0-9]{1,2}[,] (?:19[7-9]\d|2\d{3})(?=\D|$),但这并没有让我得到任何结果

  • 简而言之,我需要匹配的字符串为:“Month[space]Day[comma][space]Year” 我不在乎闰年和月份的天数应该在 1 到 31 之间,没有前导 0
  • 我需要这个正则表达式才能在 python 上工作

【问题讨论】:

  • 你能添加所有可能的输入字符串吗,有效的和无效的
  • 另外,你应该添加完整的代码而不是...
  • 我打赌你忘了:1) 正则表达式分隔符,2) 双反斜杠,3) 在regex101.com 测试它。它是用什么语言写的?什么是正则表达式?
  • @WiktorStribiżew 我猜,这回答了问题。
  • @Tushar 实际上我只需要像“2014 年 10 月 21 日”这样的月份缩写,而所有不是这种格式的“月[空格]日[逗号][空格]年”应该是无效的。我不关心闰年,天数可以是 1 到 31 之间的任何值。请注意,天数只是 1 而不是 01。@ Wiktor 我正在使用 python 来处理这个正则表达式,并尝试了 regex101,但没有成功。这是完整的正则表达式: \b(?:Jan?|?:Feb?|?:Mar?|?:Apr?|?:May?|?:Jun?|?:Jul?|?:Aug?|? :Sep?|?:Oct?|?:Nov?|?:Dec?) [0-9]{1,2}[,] (?:19[7-9]\d|2\d{3} )(?=\D|$)

标签: regex


【解决方案1】:

可能满足您的需求。

但请记住,您将需要更复杂的验证,例如验证特定月份的天数(例如,2 月最多只能有 28 天(在 bissext 年份为 29 天),等等)

(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})

与它一起玩here

同样,这绝对是一个非常简单的正则表达式,您必须有许多更好的解决方案,但也许这可能足以满足您的需求,我不知道。

【讨论】:

  • 共享相同前缀的替代方案将减慢此正则表达式的代码执行速度。如果输入的字符串很短,没关系,如果很长,则可能有问题。以 OP 的方式收缩它是个好主意。
  • Jan(?:uary)?代替Jan|January
  • @WiktorStribiżew:在这种情况下使用非捕获组比捕获组有什么优势,就像我一样?
  • @Veverke: 1) 更容易阅读(对我而言),因为它是...),2) 更短,3) 更高效(最佳实践是每个替代分支在相同的位置,否则可能会有太多不必要的回溯)。
  • @AlonsodelArte:它很长 - 但只有简单的正则表达式构造/表达式。
【解决方案2】:

下一个可以用于python月份字符串中有错误的日期:

"".join((re.compile('(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\.)?(\w*)?(\.)?(\s*\d{0,2}\s*),(\s*\d{4})', re.S + re.I).findall('Some wrong date is Septeme 28, 2002date') + ['n/a'])[0])

输出是:

'Septeme 28 2002'

1 组是月星:

(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)

2-4 组是可选的月份后缀,可以包含点或字母数字字符:

(\.)?(\w*)?(\.)?

Sep.Sept.Septem

中匹配.t.tem

5组是日期编号,可以是也可以不是,所以表达式中的0代表没有日期编号的日期:

(\s*\d{0,2}\s*)

6组是一年:

(\s*\d{4})

\s* 代表可能的“空”字符(空格、制表符等),从 0 到多个

[0] 如果列表中有几个日期元组,则采用第一个匹配项

+ ['n/a'] 可以添加为额外的列表元素,以防日期不匹配,因此列表中至少存在 1 个元素,并且在使用 [0] 元素时不会出现“列表索引超出范围”错误

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 2019-06-01
    • 1970-01-01
    • 2019-09-27
    • 2011-02-08
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多