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

正则表达式匹配带年份日期时多捕获后续数字如何修正?

正则修正方案

核心问题原因

原正则末尾的年份匹配规则[0-9]{2,4}没有边界限制,贪婪匹配模式下会将年份后紧跟的时间数字也纳入匹配范围,导致年份多匹配1位数字。

修正方法

在正则末尾的年份匹配段后增加负向先行断言(?!\d),限制匹配的2-4位数字后不能紧跟其他数字,避免吞掉后续无关的时间数字。
另外可以新增re.IGNORECASE匹配标志简化正则,无需单独处理月份的大小写情况。

修改后的完整代码

import re

text = "May 2020 Musical Portraits September 24 - 25, 2021 Time: 8:00 pm Toledo Museum of Art Peristyle  Romeo & JulietSpecial EventWhenFriday, Mar 23 / 20187:30pmBuy TicketsSunday, Mar 25 / 20182:30pmBuy TicketsWhereSamford University Wright CenterMap & DirectionsArtist"
# 仅修改最后一段匹配规则,增加(?!\d)断言
format_list = [r"(?:(?:Jan)|(?:Feb)|(?:Mar)|(?:Apr)|(?:May)|(?:Jun)|(?:Jul)|(?:Aug)|(?:Sep)|(?:Oct)|(?:Nov)|(?:Dec))\w*(?:\s)?(?:\n)?[0-9]{1,2}(?:\s)?(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4}(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4}(?!\d)"]

all_dates=[]

for pattern in format_list:
    # 增加re.IGNORECASE忽略大小写
    all_dates = re.findall(pattern, text, flags=re.IGNORECASE)
    if all_dates == []:
        continue
    else:
        for index,txt in enumerate(all_dates):
            # 原代码这里变量名覆盖了外层的text,修改为临时变量名避免冲突
            clean_txt = re.sub('([^\x00-\x7F]+)|(\n)|(\t)',' ', txt)
            all_dates[index] = clean_txt
    print(all_dates)

输出结果

['September 24 - 25, 2021', 'Mar 23 / 2018', 'Mar 25 / 2018']

完全符合预期要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:57:01