
本文介绍如何利用Python的re.sub()配合正则表达式,精准匹配并重排文件名中的模式(如*.rem.1.gz → *.1.trim.gz),支持大小写不敏感、批量处理及配对逻辑扩展。
本文介绍如何利用python的`re.sub()`配合正则表达式,精准匹配并重排文件名中的模式(如*.rem.1.gz → *.1.trim.gz),支持大小写不敏感、批量处理及配对逻辑扩展。
在处理批量生物信息学或日志文件命名时,常需按规则重构文件名:例如将 *.rem.1.gz 和 *.rem.2.gz 统一改为 *.1.trim.gz 和 *.2.trim.gz,即把 rem. 移至数字之后,并插入 .trim。直接使用字符串 replace() 无法识别数字位置,必须借助正则表达式实现「捕获数字 + 重组结构」。
✅ 推荐正则方案(简洁高效)
使用锚定结尾的模式,避免冗余捕获,提升可读性与性能:
import re # 单个字符串示例 s = "*.rem.1.gz" pattern = r'(?i)\.rem\.([0-9]+)\.gz$' # (?i) 表示忽略大小写;$ 确保匹配到字符串末尾 result = re.sub(pattern, r'.\1.trim.gz', s) print(result) # 输出: *.1.trim.gz
- (?i):启用大小写不敏感匹配(兼容 REM、Rem 等变体);
- \.rem\.([0-9]+)\.gz$:精确匹配 .rem. + 一位或多数字 + .gz 且位于字符串末尾;
- r'.\1.trim.gz':\1 引用第一个捕获组(即数字),重组为 .N.trim.gz。
? 批量处理与配对生成
结合 os.listdir() 实现目录级批量转换,并按数字配对(如 1 和 2 文件成对):
import os
import re
def rename_and_pair(files):
pattern = r'(?i)\.rem\.([0-9]+)\.gz$'
renamed = []
for f in files:
if re.search(pattern, f): # 过滤匹配项
new_name = re.sub(pattern, r'.\1.trim.gz', f)
renamed.append(new_name)
# 按数字分组配对(例如提取数字后按升序两两分组)
pairs = {}
for name in renamed:
match = re.search(r'\.(\d+)\.trim\.gz$', name)
if match:
num = int(match.group(1))
pairs.setdefault(num, []).append(name)
# 生成配对字符串列表(如 ["*.1.trim.gz", "*.2.trim.gz"])
paired_list = [sorted(pairs[k]) for k in sorted(pairs.keys()) if len(pairs[k]) >= 1]
return renamed, paired_list
# 示例调用
allfiles = ["sample.rem.1.gz", "sample.rem.2.gz", "data.REM.1.GZ"]
renamed_files, paired_groups = rename_and_pair(allfiles)
print("重命名结果:", renamed_files)
print("配对分组:", paired_groups)⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 原始代码中 os.listdir 缺少括号调用(应为 os.listdir("."));
- 正则中 (\d+) 在 replace 字符串中无效(仅在 re.sub 的 pattern 中生效),切勿写成 "rem.(\d+)" 这类字面量;
- 若文件名含路径,建议先用 os.path.basename() 提取文件名再处理,避免干扰路径分隔符;
- 对于更复杂规则(如保留前缀大小写、支持多段数字),可扩展捕获组或使用 re.compile() 预编译提升效率。
掌握该模式后,你可灵活适配类似场景:log.backup.3.txt → log.3.bak.txt、raw_007_data.zip → data_007.raw.zip 等结构化重命名任务。


















