Python正则批量重命名图片时扩展名异常问题求助
批量重命名图片文件添加_resized后缀的问题解决
原代码的问题分析
- 正则表达式字符组使用错误:
[a-z|0-9]中的|会被当作普通字符匹配,且仅匹配单个字母/数字,无法覆盖文件名中的空格、连字符等合法字符。 - 扩展名匹配逻辑错误:
[jpb|pnm|ggp]完全不符合jpg/png/bmp的格式,且仅匹配单个字符,导致扩展名被错误拆分替换。 - 正则分组逻辑错误:没有正确捕获完整的文件名前缀和扩展名,导致替换后格式混乱。
解决方案
方案1:修正正则表达式
调整正则规则,正确捕获完整的文件名前缀和扩展名,替换时在前缀后添加_resized:
import glob import re files = glob.glob('*.jpg') + glob.glob('*.png') + glob.glob('*.bmp') for x in files: # 匹配开头到最后一个.的所有内容,以及后面的jpg/png/bmp扩展名 new_file = re.sub(r'^(.*)\.(jpg|png|bmp)$', r'\1_resized.\2', x, flags=re.IGNORECASE) print(new_file, ' : ', x)
说明:flags=re.IGNORECASE可兼容大小写扩展名(如JPG、Png),无需兼容可直接删除该参数。
方案2:使用os.path模块更稳妥
处理文件名推荐用Python标准库的os.path模块,避免正则的边界问题(比如文件名包含多个点的情况):
import glob import os files = glob.glob('*.jpg') + glob.glob('*.png') + glob.glob('*.bmp') for x in files: # 拆分文件名和扩展名 name, ext = os.path.splitext(x) new_file = f"{name}_resized{ext}" print(new_file, ' : ', x) # 若需要实际执行重命名,取消注释下面一行 # os.rename(x, new_file)
该方法逻辑直观,能处理所有合法文件名,无需考虑正则匹配的边界漏洞。
测试效果
对于输入Batman - The Grey Ghost.png、Mom and Dad - Young.jpg,两种方案均会输出预期的Batman - The Grey Ghost_resized.png、Mom and Dad - Young_resized.jpg,不会出现扩展名拆分错误。
内容的提问来源于stack exchange,提问作者Pratyush Biswas
相关产品推荐
相关产品推荐

