具有最大年龄的出生日期的正则表达式

Regex for date of birth with maximum age

我正在 Python 中寻找一个正则表达式,其中出生日期的数学是给定的格式:dd.mm.YYYY

例如:

我在 demo 中提供了更多示例。

早于 01.01.1920 的日期不应匹配!!!

\d\{2}.\d\{2}.\d{4}

应在应用程序级别验证日期值。

尝试:

^(?:[0-2][1-9]|3[01])\.(?:0[1-9]|1[12])\.(?:19[2-9]\d|[2-9]\d{3})$

See Regex Demo

请注意,这不会捕捉到像 2021 年 2 月 31 日这样的日期,也就是说,它还不够复杂,无法知道任何给定月份有多少天,并且尝试提出一个正则表达式是没有希望的这样做是因为二月是有问题的,因为正则表达式无法计算哪些年份是闰年。

这也将允许未来的日期,例如 01.01.3099(您确实希望它在未来工作,不是吗?)。

更新

你确实需要使用 datetime 包中的 datetime class,如果你想坚持日期和月份字段包含两位数,正则表达式只是确保格式:

import re
from datetime import datetime, date

validated = False # assume not validated
s = '31.03.2019'
m = re.fullmatch(r'\d{2}\.\d{2}\.\d{4}', s)
if m:
    # we have ensured the correct number of digits:
    try:
        d = datetime.strptime(s, '%d.%m.%Y').date()
        if d >= date(1920, 1, 1):
            validated = True
    except ValueError:
        pass
print(validated)

正如我所说,这可以用一个非常复杂的正则表达式来完成。然而,我实际上并不推荐使用它,我只是把它当作一个挑战来写。实际上,您应该使用非常宽松的正则表达式并验证代码中的范围。

Demo.

# Easy dates, those <= 28th, valid for all months/years.
(0[1-9]|1[0-9]|2[0-8])\.(0[1-9]|1[0-2])\.(19[2-9][0-9]|2[0-9][0-9][0-9])    

|

# Validate the 29th of Februari for 1920-1999.
29\.02\.19([3579][26]|[2468][048])

|

# Validate the 29th of Februari for 2000-2999.
29\.02\.((2[0-9])(0[48]|[13579][26]|[2468][048])|2000|2400|2800)

|

# Validate 29th and 30th.
(29|30)\.(01|0[3-9]|1[0-2])\.(19[2-9][0-9]|2[0-9][0-9][0-9])

|

# Validate 31st.
31\.(01|03|05|07|08|10|12)\.(19[2-9][0-9]|2[0-9][0-9][0-9])