【问题标题】:Regex for date of birth with maximum age最大年龄的出生日期的正则表达式
【发布时间】:2021-09-14 10:41:40
【问题描述】:

我正在寻找 Python 中的正则表达式,它计算出生日期是给定的格式:dd.mm.YYYY

例如:

  • 1999 年 12 月 31 日(12 月 31 日)
  • 02.07.2021

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

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

【问题讨论】:

  • 如果你知道格式,为什么不转换为整数并检查树组件?肯定会更快,资源更少
  • 只是一个建议——使用正则表达式来限制格式,但使用比较来限制范围
  • 不幸的是,我为我的任务创建了一个正则表达式。我正在构建一个机器人。该机器人验证多个输入,如生日、城市、姓名、邮政编码……机器人只需要一个正则表达式作为验证规则。如果这不可能或很难做到,我必须重新设计机器人很多
  • 正则表达式并非旨在进行更少/更大的比较。如果这是您必须使用的唯一工具,那么您就不走运了。祝你重新设计好运。
  • @MarkRansom 它被超级诅咒,但从技术上讲是可以做到的......

标签: python regex date match


【解决方案1】:

试试:

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

See Regex Demo

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

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

更新

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

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)

【讨论】:

  • 非常感谢。好吧,未来的日子是另一个我没有想到的问题。也许我很乐观地用正则表达式处理问题
  • 这看起来是最实用的解决方案!
【解决方案2】:

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

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])

【讨论】:

  • 哇,这确实是一个非常复杂的正则表达式。我会将其标记为解决方案,但可能会尝试重新设计我的机器人逻辑。最实用的解决方案是@Booboo 提到的一个
  • 您的正则表达式是否考虑了所有规定哪些年份是闰年的规则?
  • @Booboo 据我所知(如果能被 4 整除,闰年,除非能被 100 整除,除非能被 400 整除,否则再次是),是的。我的正则表达式只接受 1920-2999 年的日期,我相信所有这些日期都是正确的(除非将来发生任何日历更改)。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2019-12-28
    • 2019-09-05
    相关资源
    最近更新 更多