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

如何用re.search获取多个剧集编号?正则表达式优化求助

提取电视剧文件名中的多集编号并优化代码

问题说明

解析电视剧文件名用于重命名时,现有方案依赖28条if/elif语句,维护成本高。当前核心问题是:使用re.search只能提取第一个剧集编号,无法获取所有集号,现有代码及输出如下:

import re

def main():
    pattern = '(.*)\\.S(\\d+)[E(\\d+)]+'
    strings = ['blah.s01e01e02e03', 'foo.s09e09', 'bar.s05e05']

    for string in strings:
        print(string)
        result = re.search("(.*)\\.S(\\d+)[E(\\d+)]+", string, re.IGNORECASE)
        print(result.group(2))

if __name__== "__main__":
    main()

输出:

blah.s01e01e02e03
01
foo.s09e09
09
bar.s05e05
05

解决方案

1. 提取全部剧集编号的正则优化

re.search仅能匹配一次结果,要获取所有集号,需分两步处理:先匹配出季号和包含所有集号的片段,再单独提取每个集号。修改后的代码如下:

import re

def main():
    # 匹配前缀、季号及所有集号的整体片段
    season_pattern = r'(.*)\.S(\d+)(E\d+)+'
    # 单独匹配单个集号的正则
    episode_pattern = r'E(\d+)'
    strings = ['blah.s01e01e02e03', 'foo.s09e09', 'bar.s05e05']

    for string in strings:
        print(string)
        season_match = re.search(season_pattern, string, re.IGNORECASE)
        if season_match:
            season_num = season_match.group(2)
            # 提取所有符合格式的集号
            episode_list = re.findall(episode_pattern, string, re.IGNORECASE)
            print(f"季号: {season_num}, 集号列表: {episode_list}")

if __name__== "__main__":
    main()

运行输出:

blah.s01e01e02e03
季号: 01, 集号列表: ['01', '02', '03']
foo.s09e09
季号: 09, 集号列表: ['09']
bar.s05e05
季号: 05, 集号列表: ['05']

2. 替代28条if/elif的优化思路

针对大量条件判断的问题,可将所有可能的文件名格式整理为正则表达式列表,遍历匹配即可,无需逐个编写if/elif:

import re

def parse_filename(filename):
    # 定义所有可能的文件名格式正则,可按需扩展
    patterns = [
        # 格式1: 前缀.SxxExxExx
        r'(.*)\.S(\d+)(E\d+)+',
        # 格式2: 前缀.xxxExxExx(无S标识的季号)
        r'(.*)\.(\d+)x(\d+)(x\d+)*',
        # 格式3: 前缀 第x季第xx集
        r'(.*)第(\d+)季第(\d+)集(第(\d+)集)*'
    ]

    for pattern in patterns:
        match = re.search(pattern, filename, re.IGNORECASE)
        if match:
            # 根据不同格式提取对应信息
            if 'S' in pattern.upper():
                prefix = match.group(1)
                season = match.group(2)
                episodes = re.findall(r'E(\d+)', filename, re.IGNORECASE)
                return {'前缀': prefix, '季号': season, '集号': episodes}
            elif 'x' in pattern:
                prefix = match.group(1)
                season = match.group(2)
                episodes = re.findall(r'x(\d+)', filename, re.IGNORECASE)
                return {'前缀': prefix, '季号': season, '集号': episodes}
            # 其他格式的处理逻辑可在此扩展
    return None

# 测试示例
filenames = ['blah.s01e01e02e03', 'show.02x03x04', '动漫 第3季第5集第6集']
for fn in filenames:
    result = parse_filename(fn)
    print(f"{fn}: {result}")

这种方式新增文件名格式时,只需在patterns列表中添加对应正则,代码维护性大幅提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:27:39