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

Python正则捕获组补前导零问题:批量重命名文件失败

Python 文件重命名:正则捕获组补零问题

现有文件名如下:

test tome 01 something.cbz
test tome 2 something.cbz
test tome 20 something.cbz

期望重命名为:

test 001 something.cbz
test 002 something.cbz
test 020 something.cbz

尝试的代码及问题

示例1

name = re.sub('tome [0]{0,1}(\d{1,})', str('\\1').zfill(3), name)

执行结果:

test 01 something.cbz
test 02 something.cbz
test 020 something.cbz

问题:单个数字和带前导零的两位数字仅补到两位,没达到三位要求。

示例2

name = re.sub('tome (\d{1,})', str('\\1').lstrip("0").zfill(3), name)

执行结果:

test 001 something.cbz
test 02 something.cbz
test 020 something.cbz

问题:单个数字补零后仅为两位,不符合需求。

解决方案

问题根源是直接对字面量'\\1'做处理,而非正则捕获到的实际内容。需要用re.sub的回调函数来处理每个匹配结果。

方法1:自定义处理函数

import re

def format_num(match):
    # 提取捕获组的数字,转整数去前导零,再格式化为三位带前导零的字符串
    num = int(match.group(1))
    return f"{num:03d}"

# 测试示例
filenames = [
    "test tome 01 something.cbz",
    "test tome 2 something.cbz",
    "test tome 20 something.cbz"
]

for filename in filenames:
    new_name = re.sub(r'tome (\d+)', format_num, filename)
    print(new_name)

输出结果:

test 001 something.cbz
test 002 something.cbz
test 020 something.cbz

方法2:用Lambda简化

import re

filenames = [
    "test tome 01 something.cbz",
    "test tome 2 something.cbz",
    "test tome 20 something.cbz"
]

for filename in filenames:
    new_name = re.sub(r'tome (\d+)', lambda m: f"{int(m.group(1)):03d}", filename)
    print(new_name)

说明

  • 正则表达式r'tome (\d+)'会匹配tome 后面的所有连续数字,不管有没有前导零。
  • 回调函数接收Match对象,通过group(1)获取捕获到的数字字符串,转成整数自动去除前导零,再用f"{num:03d}"格式化为三位固定长度的数字字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:25:44