Python 无法对正则表达式的年份值进行操作

Python 无法对正则表达式的年份值进行操作,python,regex,Python,Regex,这是我在这里的第一个问题,所以请原谅和教育任何格式错误。我是Python新手,正在经历一些无聊的事情。决定通过使用剪贴板和格式化一些东西来扩展日期检测项目。我遇到的问题是,在REGEX的年度部分进行的任何操作。 我已经注释掉了我上一次验证年份的尝试,放弃并更改了正则表达式,只查找从1000到2999的日期,并且跳过了日期的代码验证。 我现在需要验证闰年,但我又回到了必须使用year变量的状态,但再次说明,任何操作都没有任何效果。 基本上,问题是我可以提取年份值并显示它,但我不能修改它或对其进行检

这是我在这里的第一个问题,所以请原谅和教育任何格式错误。我是Python新手,正在经历一些无聊的事情。决定通过使用剪贴板和格式化一些东西来扩展日期检测项目。我遇到的问题是,在REGEX的年度部分进行的任何操作。 我已经注释掉了我上一次验证年份的尝试,放弃并更改了正则表达式,只查找从1000到2999的日期,并且跳过了日期的代码验证。 我现在需要验证闰年,但我又回到了必须使用year变量的状态,但再次说明,任何操作都没有任何效果。 基本上,问题是我可以提取年份值并显示它,但我不能修改它或对其进行检查

#! python3
#! detect dates in a block of text

import pyperclip
import re

#!import numpy as np


text = str(pyperclip.paste())


def datedetection(text):
dateRegex = re.compile(
    r"""(
    (\d|\d\d)               #! match day
    (/{1})                  #! match /
    (\d|\d\d)               #! match month
    (/{1})                  #! match /
    ([1|2][0-9][0-9][0-9])  #! match year
    )""",
    re.VERBOSE,
)
matches = []
for groups in dateRegex.findall(text):
    day = str(groups[1])
    slash1 = str(groups[2])
    month = str(groups[3])
    slash2 = str(groups[4])
    year = str(groups[5])
    month_range_30 = ["04", "06", "09", "11"]
    month_range_31 = ["01", "03", "05", "07", "08", "10", "12"]
    month_range_Feb = ["02"]
    #!year_range = np.arange(1000, 3000, 1).tolist()

    if len(day) == 1:
        day = "0" + day
    else:
        day = day
    if len(month) == 1:
        month = "0" + month
    else:
        month = month

    if month in month_range_31:
        if int(day) > 31:
            day = "Too many days in a month with only 31 days."
            slash1 = month = slash2 = year = ""

    elif month in month_range_30:
        if int(day) > 30:
            day = "Too many days in a month with only 30 days."
            slash1 = month = slash2 = year = ""
    elif month in month_range_Feb:
        if int(day) > 29:
            day = "Too many days in February."
            slash1 = month = slash2 = year = ""
    elif int(month) > 12:
        day = "Found an invalid month."
        slash1 = month = slash2 = year = ""
    elif month in month_range_Feb:
        if (
            int(day) == 29
            and (int(year) % 4 == 0)
            and (int(year) % 400 == 0)
            and (int(year) % 100 == 0)
        ):
            day = day
    elif month in month_range_Feb:
        if (
            int(day) == 29 
            and (int(year) % 4 == 0) 
            and (int(year) % 100 != 0)
        ):
            day = "Found an invalid leap year."
            slash1 = month = slash2 = year = ""
    #!elif year not in year_range:
    #!day = "Year is out of range."
    #!slash1 = month = slash2 = year = ""

    dates = "".join([day, slash1, month, slash2, year])
    matches.append(dates)

if len(matches) > 0:
    pyperclip.copy("\n".join(matches))
    print("Copied to clipboard:")
    print("\n".join(matches))
else:
    print("No dates found.")


datedetection(text)

问题出在今年的运营之前。日和月操作覆盖了年值。目前还不完全确定如何或为什么,但将年份代码移到日期和月份代码上方已经开始解决问题。

Regex不是验证日期的正确工具(即使它可以完成这项工作)。您可以使用正则表达式查找/提取看起来像日期的字符串,但不使用正则表达式验证它们。我对python了解不多,但您应该在中找到一个合适的解决方案。关于您的模式的旁注:1)
\d |\d\d
可以是
\d\d?
。2) 切勿使用
{1}
;这是多余的。3)
[1 | 2]
应该是
[12]
(或者
(?:1 | 2)
,如果您想使用
,但这里不需要)。4)
[0-9]
重复3次可以写成
[0-9]{3}
。祝你好运
strtime
是你的朋友!20([0248][048]|[1379][26])符合21世纪的闰年。根据其他世纪的需要进行调整。关于regex在验证日期方面的实用性:regex可能比上述代码更紧凑。有了适当的评论,这也是可以理解的。