我试图确定给定的日期字符串是否包含所有三个组成部分:日、月和年。
输入和预期输出示例:
我正在使用的方法:
我目前正在使用
dateutil.parser.parse
函数来解析日期字符串,然后检查生成的日期时间对象中的年、月和日属性是否有效。但是,解析函数会使用默认值填充缺失的组件,从而很难确定这些组件是否在输入字符串中显式提供。因此,我编写了以下逻辑来解决该问题。
def parse_date(date_string):
try:
default_dt1 = datetime(1,1,1)
default_dt2 = datetime(2,2,2)
parsed_date1 = dateutil.parser.parse(date_string,default=default_dt1)
parsed_date2 = dateutil.parser.parse(date_string,default=default_dt2)
if parsed_date1 == parsed_date2:
# print(parsed_date1.month)
return True
return False
except (ValueError,TypeError):
return False
工作原理:
默认日期:
该函数使用两个默认日期
datetime(1, 1, 1)
和 datetime(2, 2, 2)
,在解析输入日期字符串时填充缺失的部分。
解析:
它使用
date_string
函数(来自 parser.parse
模块)和两个不同的默认日期解析 dateutil.parser
两次。
如果 date_string
缺少组件(例如一天或一个月),parser.parse
将使用默认值来填补空白。
比较:
如果两个解析结果相同,则表明 date_string 具有所有组件,因为缺少组件会因默认值不同而导致两个解析日期存在差异。
问题:
如何可靠地检查日期字符串是否显式包含所有三个组成部分,而不依赖 dateutil 添加的默认值?有没有更好的方法来实现这一目标?我尝试将默认值设置为“无”,但它不起作用。令人惊讶的是没有默认功能来实现这一点。
注意:输入格式不一致。
对于您展示的示例以及大多数其他示例,不需要专门的日期解析。您所需要的只是一个简单的
re.split
来查找日期字符串是否可以准确地拆分为 3 个“单词”组件:
import re
date_strs = ["2025-01-01", "January 31, 2026", "January 2026", "2026", "2025-01",]
def has_3_components(date_str):
date_lst = re.split(r'\W+', date_str)
return len(date_lst) == 3
for date_str in date_strs:
print(f"{date_str}: {has_3_components(date_str)}")
打印:
2025-01-01: True
January 31, 2026: True
January 2026: False
2026: False
2025-01: False
当然,这个简单的方法不会尝试确定字符串是否是正确的有效日期,因此以下无意义字符串(以及许多其他字符串)也将返回
True
:“Foo 1, 2025”,“Feb- 31-2024”,或者只是“foo bar baz”。