python - 正则表达式匹配多种日期格式
问题描述
我想以以下每种格式将 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 个我无法修复的严重错误:
1921-00
匹配成功在我的解决方案中没有限制“月份或日期中只有 2 位数字中的 1 位可以为 0,但不能同时为 0 位”
1921-
匹配成功在我的解决方案中没有限制“日期的最后一个符号只能是数字,不能是连字符”
1921-1
匹配成功在我的解决方案中没有限制“月份和日期可能只包含 0 或 2 位数字,而不是 1 位数字”
主要的:
1921-22
匹配成功在我的解决方案中没有“没有月份就不能存在日期”的限制
我正在使用 Python(如果重要的话)。我将非常感谢帮助我将此限制添加到我的解决方案中。
解决方案
您可以使用该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 不在有效范围内。
推荐阅读
- sql - Oracle 查询以获取初始更改值
- javascript - Angular6 HttpClient:在获取请求时注入标头在 Chrome 和 IE11 上不起作用
- javascript - 正则表达式在 javascript 和 .NET 中给出不同的结果
- python - 提取括号python之间的年份
- c++ - Can I escape (suppress) C preprocessor macro expansion
- python - ParDo 行为的 Apache Beam 解释
- javascript - Checkbox won't retrieve value in that row
- vba - Word in message box appears in a different line
- java - 使用 Threadpool 和 executor 服务进行处理
- ui-automation - 从文件中打开 URL 并在 UiPath 中截屏