我正在尝试确定给定的日期字符串是否包含所有三个组成部分:日、月和年

问题描述 投票:0回答:1

我试图确定给定的日期字符串是否包含所有三个组成部分:日、月和年。

输入和预期输出示例:

  • “2025-01-01”→ True(所有组件都存在)
  • “2026 年 1 月 31 日”→ True(包含所有组件的自然语言格式)
  • “2026 年 1 月”→ 错误(缺少日期)
  • “2026”→ False(缺少月份和日期)
  • “2025-01”-> 错误

我正在使用的方法:

我目前正在使用

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 添加的默认值?有没有更好的方法来实现这一目标?我尝试将默认值设置为“无”,但它不起作用。令人惊讶的是没有默认功能来实现这一点。

注意:输入格式不一致。

python python-datetime python-dateutil
1个回答
0
投票

对于您展示的示例以及大多数其他示例,不需要专门的日期解析。您所需要的只是一个简单的

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”。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.