首页 > 解决方案 > 正则表达式匹配多种日期格式

问题描述

我想以以下每种格式将 1900-01-01 与 2099-12-31 匹配:

YYYY
YYYY-MM
YYYY-MM-DD

这是我目前的解决方案:

^(19|20)[0-9]{1}[0-9]{1}-?([0,1]{0,1}[0-2]{0,1}){0,1}-?([0-3]{0,1}[0-9]{0,1}){0,1}

但我的解决方案至少有 4 个我无法修复的严重错误:

  1. 1921-00匹配成功

    在我的解决方案中没有限制“月份或日期中只有 2 位数字中的 1 位可以为 0,但不能同时为 0 位”

  2. 1921-匹配成功

    在我的解决方案中没有限制“日期的最后一个符号只能是数字,不能是连字符”

  3. 1921-1匹配成功

    在我的解决方案中没有限制“月份和日期可能只包含 0 或 2 位数字,而不是 1 位数字”

主要的:

  1. 1921-22匹配成功

    在我的解决方案中没有“没有月份就不能存在日期”的限制

我正在使用 Python(如果重要的话)。我将非常感谢帮助我将此限制添加到我的解决方案中。

标签: pythonregex

解决方案


您可以使用该datetime模块:

from datetime import datetime
dateformats = ("%Y", "%Y-%m", "%Y-%m-%d")
dates = ("2020", "2020-06", "2020-06-16", "2020-15", "2020-16-06", "1875-10-20")

for date_str in dates:
    for date_fmt in dateformats:
        try:
            date = datetime.strptime(date_str, date_fmt)
        except ValueError:
            pass
        else:
            if 1900 <= date.year <= 2099:
                print(f"{date_str} is valid.")
            else:
                print(f"{date_str} is not in valid range.")
            break
    else:
        print(f"{date_str} is not valid.")

输出:

2020 年有效。
2020-06 有效。
2020-06-16 有效。
2020-15 无效。
2020-16-06 无效。
1875-10-20 不在有效范围内。

推荐阅读