
本文介绍如何利用Python的re.sub()函数,通过正则表达式精准匹配并重排文件名中的模式(如*.rem.1.gz → *.1.trim.gz),支持大小写不敏感、批量处理及成对分组逻辑。
本文介绍如何利用python的`re.sub()`函数,通过正则表达式精准匹配并重排文件名中的模式(如*.rem.1.gz → *.1.trim.gz),支持大小写不敏感、批量处理及成对分组逻辑。
在处理批量生物信息学或日志文件命名时,常需按规则重构文件名结构。例如,将形如 sample.rem.1.gz 和 sample.rem.2.gz 的配对文件统一改为 sample.1.trim.gz 和 sample.2.trim.gz。核心挑战在于:保留通配符或前缀、提取中间数字、并将固定后缀 .rem. 替换为 .trim. 且置于数字之后。
直接使用字符串 replace() 无法识别数字位置,因此必须借助正则表达式实现模式化替换。
✅ 推荐方案:使用 re.sub() 进行安全重写
import re
import os
# 示例文件列表(实际中可从目录读取)
allfiles = ["fileA.rem.1.gz", "fileA.rem.2.gz", "DATA.REM.1.GZ", "test.rem.10.gz"]
# 方案一:捕获前缀 + 数字(推荐,语义清晰)
pattern1 = r'(?i)(.*)\.rem\.([0-9]+)\.gz$'
replaced = [re.sub(pattern1, r'\1.\2.trim.gz', f) for f in allfiles]
print("方案一结果:", replaced)
# 输出:['fileA.1.trim.gz', 'fileA.2.trim.gz', 'DATA.1.trim.GZ', 'test.10.trim.gz']
# 方案二:精简版(不捕获前缀,仅定位 `.rem..gz` 结尾)
pattern2 = r'(?i)\.rem\.([0-9]+)\.gz$'
replaced2 = [re.sub(pattern2, r'.\1.trim.gz', f) for f in allfiles]
print("方案二结果:", replaced2)
# 输出相同,但更高效(减少捕获组开销)
? 正则说明:
Python 3.14.2下载Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- (?i):启用忽略大小写模式(兼容 .REM. 或 .rem.);
- (.*):捕获任意前缀(方案一);\.rem\. 匹配字面量 .rem.;
- ([0-9]+):捕获一个或多个数字(即 1, 2, 10 等),作为 \1 引用;
- \.gz$:确保匹配以 .gz 结尾,避免误替换中间子串;
- 替换串 r'\1.\2.trim.gz' 中,\1 是前缀,\2 是数字,顺序重组。
? 扩展:自动配对生成双文件组
若需将 .1.gz 与 .2.gz 文件成对组合(如用于后续比对分析),可在重命名后按数字分组:
from collections import defaultdict
renamed = [re.sub(r'(?i)\.rem\.([0-9]+)\.gz$', r'.\1.trim.gz', f) for f in allfiles]
pairs = defaultdict(list)
for fname in renamed:
match = re.search(r'\.([0-9]+)\.trim\.gz$', fname)
if match:
num = int(match.group(1))
pairs[num].append(fname)
# 按数字升序输出成对项(如 1→[f1,f2],2→[f1,f2]…)
for num in sorted(pairs):
if len(pairs[num]) == 2:
print(f"Pair {num}: {pairs[num]}")
⚠️ 注意事项
- 始终使用原始字符串(r'')定义正则,避免反斜杠转义错误;
- $ 锚点至关重要——防止 abc.rem.1.gz.xyz 被错误匹配;
- 若文件扩展名不固定(如 .bz2、.zip),可将 gz 改为 (gz|bz2|zip);
- 实际批量处理前建议先用 print() 验证替换逻辑,再调用 os.rename() 安全改名。
掌握此模式,即可灵活应对各类「数字锚点重排」命名需求,兼顾准确性与可维护性。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











