我正在Python中寻找一个正则表达式,它计算的出生日期是给定的格式:dd.mm.YYYY
例如:
- 31.12.1999(12月31日(
- 2021年7月2日
我在演示中提供了更多的示例。
日期早于2020年1月1日的日期不应匹配!!!
尝试:
^(?:[0-2][1-9]|3[01]).(?:0[1-9]|1[12]).(?:19[2-9]d|[2-9]d{3})$
参见Regex Demo
请注意,这不会赶上2021年2月31日这样的日期,也就是说,它还不够复杂,无法知道任何一个月有多少天,也无法尝试想出一个能够做到这一点的正则表达式,因为二月是有问题的,因为正则表达式无法计算哪些年份是闰年。
这也将允许未来的日期,如1999年1月1日(你确实希望这是未来的工作,不是吗?(。
更新
您确实需要使用datetime
包中的datetime
类,如果您想坚持日期和月份字段包含两位数字,则需要使用regex来确保格式:
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)
正如我所说,它可以用一个非常复杂的正则表达式来完成。然而,我实际上并不建议使用这个,我只是把它作为一个挑战写得很有趣。实际上,您应该使用一个非常宽松的正则表达式来验证代码中的范围。
演示。
# 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])
d{2}.d{2}.d{4}
应在应用程序级别验证日期的值。