当前位置: 首页 > 图灵资讯 > 行业资讯> 如何在Python中使用正则表达式将数字前的固定字符串替换为数字后的指定字符串

如何在Python中使用正则表达式将数字前的固定字符串替换为数字后的指定字符串

来源:图灵python
时间: 2026-07-23 17:06:37

本文介绍了如何使用Pythonre.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 3.14.2

Python 3.14.2是Python编程语言于2025年12月5日发布的稳定版本,属于3.14系列的第二次维护更新。该版本包含18个修复项目,重点解决多过程、数据和正则表达模块的回归问题,修复CVE-2025-12084等安全漏洞。这个版本标志着Python发展的一个重要里程碑,即自由线程模式(删除GIL)正式得到官方支持。

下载

立即学习“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 结构化重命名任务等。