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

正则匹配字符串最后年份: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(符合预期)

关键修改点说明

  1. 从匹配第一个到收集所有:
    原来的rg.search(title)只会返回第一个匹配到的年份,这就是为什么开头的年份会被错误返回。现在改用findall,可以收集所有符合格式的年份项。

  2. 调整正则表达式:
    去掉了原来前缀的.*?,直接匹配所有符合19xx/20xx格式的年份(带或不带括号/方括号),确保不会漏掉任何可能的年份。正则中的分组(19[0-9]{2}|20[0-9]{2})专门提取纯年份数字,方便后续校验。

  3. 筛选有效年份并取最后一个:
    对所有匹配到的年份进行范围校验,把符合条件的年份存入列表,最后返回列表的最后一个元素——这就实现了提取最后一个有效发行年份的需求。

  4. 严谨的范围校验:
    用min(current_year, 2099)来限制上限,避免当前年份超过2099时出现不符合逻辑的结果(虽然短期内不会发生,但让代码更健壮)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:13:23