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

