正则匹配字符串最后年份:Python脚本优化需求
解决从文件名提取最后一个有效发行年份的问题
我来帮你搞定这个问题!你的核心需求是从文件名中提取最后一个符合范围(1900-当前年份/2099)的发行年份,而不是第一个匹配到的年份。咱们来一步步修改你的函数:
修改后的完整代码
import re from datetime import datetime def ExtractReleaseYear(title): # 匹配所有符合格式的年份:带括号/方括号或不带的4位数字(19xx或20xx) year_pattern = re.compile(r'([\[\(]?(19[0-9]{2}|20[0-9]{2})[\]\)]?)', re.IGNORECASE) # 找出所有匹配的年份项 all_year_matches = year_pattern.findall(title) if not all_year_matches: return "" current_year = datetime.now().year valid_years = [] for match in all_year_matches: # 正则分组的第二个元素是纯年份数字(去掉了括号/方括号) year_str = match[1] try: year = int(year_str) # 校验年份范围:1900到当前年份和2099的较小值(保证严谨性) if 1900 <= year <= min(current_year, 2099): valid_years.append(year_str) except ValueError: print("ERROR: The film year in the file name could not be converted to an integer for comparison.") # 返回最后一个有效的年份,没有则返回空字符串 return valid_years[-1] if valid_years else "" # 测试用例验证 print(ExtractReleaseYear('2012.(2009).3D.1080p.BRRip.SBS.x264')) # 返回2009(符合预期) print(ExtractReleaseYear('Into.The.Storm.2012.1080p.WEB-DL.AAC2.0.H264')) # 返回2012(符合预期) print(ExtractReleaseYear('2001.A.Space.Odyssey.1968.1080p.WEB-DL.AAC2.0.H264')) # 返回1968(符合预期)
关键修改点说明
从匹配第一个到收集所有:
原来的rg.search(title)只会返回第一个匹配到的年份,这就是为什么开头的年份会被错误返回。现在改用findall,可以收集所有符合格式的年份项。调整正则表达式:
去掉了原来前缀的.*?,直接匹配所有符合19xx/20xx格式的年份(带或不带括号/方括号),确保不会漏掉任何可能的年份。正则中的分组(19[0-9]{2}|20[0-9]{2})专门提取纯年份数字,方便后续校验。筛选有效年份并取最后一个:
对所有匹配到的年份进行范围校验,把符合条件的年份存入列表,最后返回列表的最后一个元素——这就实现了提取最后一个有效发行年份的需求。严谨的范围校验:
用min(current_year, 2099)来限制上限,避免当前年份超过2099时出现不符合逻辑的结果(虽然短期内不会发生,但让代码更健壮)。
内容的提问来源于stack exchange,提问作者ProGrammer
相关产品推荐
相关产品推荐

