代码之家  ›  专栏  ›  技术社区  ›  id345678

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

  •  -1
  • id345678  · 技术社区  · 3 年前

    我不需要在乎表现!

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

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

    这是一个用于验证月信件订单的正则表达式(1月、2月、MÃrz、4月、Mai、Juni、8月、9月、Oktober、11月、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]))
    
    0 回复  |  直到 3 年前
        1
  •  2
  •   Wiktor Stribiżew    3 年前

    你可以用

    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 .

    主要POI:

    • regex的月份是 (?: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天的月份,2月、4月、6月、9月和11月将被删除
    • 天和月的前导零通过添加 ? 后面的量词 0
    • 天和月之间的分隔符更改为 \s?[./:-][\s.]? :一个可选的空白,一个来自 ./:- 字符集,然后是可选的空格或 .
    • 月和年之间的分隔符更改为 \s?(?:[./:-][\s.]?)? :一个可选的空白,然后是一个可选的字符序列 ./:- 字符集,然后是可选的空格或 . .

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