正则表达式匹配带年份日期时多捕获后续数字如何修正?
正则修正方案
核心问题原因
原正则末尾的年份匹配规则[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
相关产品推荐
相关产品推荐

