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