【问题标题】:capture german date formats using regex使用正则表达式捕获德语日期格式
【发布时间】:2021-12-10 04:20:20
【问题描述】:

我不(不需要)关心性能!

我的正则表达式匹配日期格式dd.mm.yyyy

((([0][1-9]|[12][\d])|[3][01])[./]([0][13578]|[1][02])[./][1-9]\d\d\d)|((([0][1-9]|[12][\d])|[3][0])[./]([0][13456789]|[1][012])[./][1-9]\d\d\d)|(([0][1-9]|[12][\d])[-/][0][2][./][1-9]\d([02468][048]|[13579][26]))|(([0][1-9]|[12][0-8])[./][0][2][./][1-9]\d\d\d)

这是我的正则表达式尚未匹配的日期。 任何帮助表示赞赏。

09. Juni 1997
01.Aug.1995
27.06. 1997
29.02.1996
21. 01. 1999
28.05. 1996
07..4..1995
20:03:1998
9.4.1997
14 .03 - 1995

我一开始尝试添加月份字母但失败了(可能是因为它们之间的空格)

这是一个验证月份字母顺序的正则表达式(Januar、Februar、März、April、Mai、Juni、August、September、Oktober、November、Dezember)

(?:J(anuar|u(n|li))|Februar|Mä(rz|i)|A(pril|ugust)|(((Sept|Nov|Dez)em)|Okto)ber)

我在互联网上找到了这个,如果只有 3 个月份的字母可用,则重点关注这个问题

(((([1-9])|([0][1-9])|([1-2][0-9])|(30))\-([A,a][P,p][R,r]|[J,j][U,u][N,n]|[S,s][E,e][P,p]|[N,n][O,o][V,v]))|((([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))\-([J,j][A,a][N,n]|[M,m][A,a][R,r]|[M,m][A,a][Y,y]|[J,j][U,u][L,l]|[A,a][U,u][G,g]|[O,o][C,c][T,t]|[D,d][E,e][C,c])))\-[0-9]{4}$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-8]))\-([F,f][E,e][B,b])\-[0-9]{2}(([02468][1235679])|([13579][01345789]))$)|(^(([1-9])|([0][1-9])|([1][0-9])|([2][0-9]))\-([F,f][E,e][B,b])\-[0-9]{2}(([02468][048])|([13579][26]))

【问题讨论】:

标签: python regex date validation


【解决方案1】:

你可以使用

pattern = r"""(?x)(?<!d)(?:
  (?:(?:0?[1-9]|[12]\d)|3[01])\s?[./:-][\s.]?(?:0?[13578]|1[02]|J(?:an(?:uar)?|uli?)|M(?:ärz?|ai)|Aug(?:ust)?|Dez(?:ember)?|Okt(?:ober)?)\s?(?:[./:-][\s.]?)?[1-9]\d\d\d|
  (?:(?:0?[1-9]|[12]\d)|30)\s?[./:-][\s.]?(?:0?[13-9]|1[012]|J(?:an(?:uar)?|u[nl]i?)|M(?:ärz?|ai)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:tember)?|(?:Nov|Dez)(?:ember)?|Okt(?:ober)?)\s?(?:[./:-][\s.]?)?[1-9]\d\d\d|
  (?:0?[1-9]|[12]\d)\s?[./:-][\s.]?(?:0?2|Fe(?:b(?:ruar)?)?)\s?(?:[./:-][\s.]?)?[1-9]\d(?:[02468][048]|[13579][26])|
  (?:0?[1-9]|[12][0-8])\s?[./:-][\s.]?(?:0?2|Fe(?:b(?:ruar)?)?)\s?(?:[./:-][\s.]?)?[1-9]\d\d\d
)(?!\d)"""

请参阅regex demo

主要兴趣点:

  • 月份正则表达式是(?:J(?:an(?:uar)?|u[nl]i?)|Fe(?:b(?:ruar)?)?|M(?:ärz?|ai)|A(?:pr(?:il)?|ug(?:ust)?)|Sep(?:tember)?|(?:Nov|Dez)(?:ember)?|Okt(?:ober)?),它经过测试here。根据您的需要调整起酥油。
  • Febraury 模式单独用于最后两个交替(它们专门用于二月),并从月份模式中减去其余选项
  • 从第一个更替开始,对于 31 天的月份,2 月、4 月、6 月、9 月和 11 月的月份被删除
  • 通过在0 之后添加? 量词,可以使天和月中的前导零可选
  • 天和月之间的分隔符更改为\s?[./:-][\s.]?:一个可选的空格,一个来自./:- 字符集的字符,然后是一个可选的空格或.
  • 月份和年份之间的分隔符更改为\s?(?:[./:-][\s.]?)?:一个可选空格,然后是来自./:- 字符集的可选字符序列,然后是可选空格或.

在两端添加数字边界(?&lt;!\d) / (?!\d),以确保匹配的两端没有其他数字。

【讨论】:

  • 看起来你让每个组都成为非捕获组——为什么?对普通团体不是也一样吗? ?: 除了给这个已经非常复杂的正则表达式添加额外的混乱之外,似乎什么也没做。 (非常令人印象深刻!)
  • @fsimonjetz 请参阅Are non-capturing groups redundant? 捕获组需要为捕获的子字符串分配额外的内存,这会减慢速度。
猜你喜欢
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2012-10-09
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多