使用正则表达式捕获德语日期格式

capture german date formats using regex

我不(需要)关心性能!

我的正则表达式匹配日期格式 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]))

您可以使用

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 模式分别用于最后两个交替(它们专门用于 2 月),并从其余替代方案的月份模式中减去
  • 从第一个交替开始,对于 31 天的月份,二月、四月、六月、九月和十一月被删除
  • 通过在 0
  • 之后添加 ? 量词,使天数和月数中的前导零成为可选的
  • 天和月之间的分隔符更改为 \s?[./:-][\s.]?:一个可选的空格,一个来自 ./:- 字符集的字符,然后是一个可选的空格或 .
  • 月份和年份之间的分隔符更改为 \s?(?:[./:-][\s.]?)?:一个可选的空格,然后是一个来自 ./:- 字符集的可选字符序列,然后是一个可选的空格或 . .

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