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

