Python正则表达式无法提取并打印字符串日期,求解决方案
问题分析与解决思路
原代码无法提取日期的原因
date_regex_1匹配限制
该正则要求日期必须带st/nd/rd/th后缀(比如August 2nd, 2022),但你的测试数据是不带后缀的格式(August 2, 2022),因此完全匹配不到任何日期。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
相关产品推荐
相关产品推荐

