如何用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
相关产品推荐
相关产品推荐

