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

Python re.sub正则替换提取文件名前缀问题求助

问题根因

你的正则无法得到预期结果,核心是两个匹配逻辑错误:

  • 正则\d{4}的作用是匹配4个连续数字,但你的文件名中对应位置不是数字,是字面量字符串[0-9][0-9][0-9][0-9]。[和]是正则元字符,代表字符集范围,不做转义的话无法匹配字面意义的方括号。
  • 正则中.是通配符,可匹配任意单个字符,要匹配字面意义的点号需要转义为\.;另外列表第一个文件名的后缀是小写_all.zip,其余是大写开头的_All.zip,原正则只匹配大写A的场景,无法覆盖第一个文件。
正确实现代码

正则需要匹配的后缀结构为:下划线 + 4个连续的字面量[0-9] + 下划线 + 大小写兼容的all + .zip,将这部分替换为空字符串即可。

import re

file_list = [
    'F_5500_SF_PART7_[0-9][0-9][0-9][0-9]_all.zip',
    'F_5500_SF_[0-9][0-9][0-9][0-9]_All.zip',
    'F_5500_[0-9][0-9][0-9][0-9]_All.zip',
    'F_SCH_A_PART1_[0-9][0-9][0-9][0-9]_All.zip'
]

foldernames = [re.sub(r'_(\[0-9\]){4}_[Aa]ll\.zip', '', i) for i in file_list]

运行后得到的foldernames和预期完全一致:

['F_5500_SF_PART7', 'F_5500_SF', 'F_5500', 'F_SCH_A_PART1']
更不易出错的写法

如果需要匹配的字面量片段包含大量元字符,手动逐个转义容易漏写,可以用re.escape()方法自动转义所有正则元字符:

# 自动转义固定字面量部分的所有元字符
suffix_pattern = re.escape('_[0-9][0-9][0-9][0-9]_') + r'[Aa]ll\.zip'
foldernames = [re.sub(suffix_pattern, '', i) for i in file_list]

运行结果和上面完全一致,适合字面量内容复杂的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:57:19