You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式无法提取并打印字符串日期,求解决方案

问题分析与解决思路

原代码无法提取日期的原因

  1. date_regex_1 匹配限制
    该正则要求日期必须带 st/nd/rd/th 后缀(比如 August 2nd, 2022),但你的测试数据是不带后缀的格式(August 2, 2022),因此完全匹配不到任何日期。

  2. date_regex_2 分隔符不兼容
    该正则试图同时匹配英文缩写日期和数字日期,但它的分隔符仅支持空格、斜杠、短横,无法处理英文日期中日期后的逗号(比如 mar 6, 2013 里的 6,),导致匹配失败;同时月份部分的3字母缩写设计,也因分隔符逻辑冲突无法生效。


修复方案

1. 调整正则匹配规则

拆分正则职责,让date_regex_1专门处理英文格式日期(支持带/不带后缀),date_regex_2专门处理数字分隔格式日期:

import re

# 匹配带/不带后缀的英文日期:August 2, 2022 或 August 2nd, 2022
date_regex_1 = re.compile(r'''
    (?P<month>\w+)               # 匹配月份全名或缩写
    \s+
    (?P<day>\d{1,2})(st|nd|rd|th)? # 日期后缀设为可选
    ,\s+
    (?P<year>\d{4})              # 匹配4位年份
    \b
''', re.IGNORECASE | re.VERBOSE)

# 匹配数字分隔的日期:08/02/2022、08-02-1994、08 02 94等
date_regex_2 = re.compile(r'''
    (?P<month>\d{1,2})           # 匹配月份数字
    [\s/-]                       # 支持空格、斜杠、短横分隔符
    (?P<day>\d{1,2})             # 匹配日期数字
    [\s/-]                       # 支持相同类型分隔符
    (?P<year>\d{2}|\d{4})        # 匹配2位或4位年份
    \b
''', re.IGNORECASE | re.VERBOSE)

# 测试字符串
dates = 'August 2, 2022, mar 6, 2013, 08/02/2020, 12-31-99'

# 提取并打印所有匹配的日期
for date in date_regex_1.finditer(dates):
    print(date.group())
for date in date_regex_2.finditer(dates):
    print(date.group())

运行后会输出:

August 2, 2022
mar 6, 2013
08/02/2020
12-31-99

2. 可选:验证日期有效性

正则只能匹配格式,无法判断日期是否真实有效(比如2月30日),可以结合datetime模块做进一步验证:

from datetime import datetime

valid_dates = []
# 验证英文格式日期
for match in date_regex_1.finditer(dates):
    try:
        # 移除日期后缀后解析
        clean_date = match.group().replace('st','').replace('nd','').replace('rd','').replace('th','')
        dt = datetime.strptime(clean_date, '%B %d, %Y')
        valid_dates.append(dt.strftime('%m/%d/%Y'))
    except ValueError:
        pass

# 验证数字格式日期
for match in date_regex_2.finditer(dates):
    date_str = match.group()
    # 尝试多种数字日期格式解析
    for fmt in ['%m/%d/%Y', '%m-%d-%Y', '%m %d %Y', '%m/%d/%y', '%m-%d-%y', '%m %d %y']:
        try:
            dt = datetime.strptime(date_str, fmt)
            valid_dates.append(dt.strftime('%m/%d/%Y'))
            break
        except ValueError:
            continue

print("格式化后的有效日期:", valid_dates)

内容的提问来源于stack exchange,提问作者Peyton Hecht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:54:58