Skip to main content
 首页 » 编程设计

Python:将字符串解析为带格式的日期

2025年05月04日24wuhuacong

用户可以输入一个字符串,该字符串包含以下格式的日期 MM/DD/YY 或 MM/DD/YYYY。有没有一种有效的方法可以从字符串中提取日期?我正在考虑将 RegEx 用于 \d+\/\d+\/\d+。我还希望能够对日期进行排序。 IE。如果字符串包含 8/17/15 和 08/16/2015,它将首先列出 8/16 日期,然后列出 8/17

请您参考如下方法:

看看datetime.strptime ,它是一个内置函数,知道如何从字符串创建日期时间对象。它接受一个要转换的字符串和 format日期写在.

from datetime import datetime 
 
def str_to_date(string): 
    pattern = '%m/%d/%Y' if len(string) > 8 else '%m/%d/%y' 
    try: 
        return datetime.strptime(string, pattern).date() 
    except ValueError: 
        raise  # TODO: handle invalid input 

该函数返回一个 date()可以直接与其他 date() 对象进行比较(例如排序时)的对象。

用法:

>>> d1 = str_to_date('08/13/2015') 
>>> d2 = str_to_date('08/12/15') 
>>> d1 
datetime.date(2015, 8, 13) 
>>> d2 
datetime.date(2015, 8, 12) 
>>> d1 > d2 
True 

更新

OP 在评论中解释说,诸如 'foo 08/13/2015 bar' 之类的字符串不应该被自动丢弃,应该从中提取日期。

为此,我们必须首先在用户输入中搜索候选字符串:

import re 
from datetime import date 
 
user_string = input('Enter something')  # use raw_input() in Python 2.x 
 
pattern = re.compile(r'(\d{2})/(\d{2})/(\d{4}|\d{2})')  # 4 digits match first! 
match = re.search(pattern, user_string) 
 
if not match: 
    d = None 
else: 
    month, day, year = map(int, match.groups()) 
    try: 
        d = date(year, month, day) 
    except ValueError: 
        d = None  # or handle error in a different way 
 
print(d) 

代码读取用户输入,然后尝试在其中找到一个模式,该模式代表 MM/DD/YYYY 或 MM/DD/YY 格式的日期。请注意,最后一个捕获组(在括号中,即 ())检查四个或两个连续数字。

如果找到候选日期,它会解包匹配中的捕获组,同时将它们转换为整数。然后它使用三个匹配的片段来尝试创建一个新的 date() 对象。如果失败,则候选人日期无效,例如'02/31/2015'

脚注:

  • 代码只会捕获输入中的第一个候选日期
  • 所使用的正则表达式在其当前形式下还将匹配输入中的日期,例如“12308/13/2015123”。如果这是不可取的,则必须对其进行修改,可能会添加一些先行/后行断言。