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



我不(需要)关心性能!

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

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

这里是我的正则表达式还不匹配的日期。感谢任何帮助。

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

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

这里是一个验证月份字母顺序的正则表达式(january, february, März, April, Mai, Juni, August, September, october, November, dez12)

(?: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]ddd|
(?:(?: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]ddd|
(?: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]ddd
)(?!d)"""

参见regex演示。

主要POIs:

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

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