您如何将sub()方法与具有可选组的正则表达式一起使用?

时间:2018-09-10 09:38:19

标签: python regex optional

我已经从事此文件重命名程序几天了。由于我之前在本网站上提出的所有“愚蠢”问题以及收到的高质量答复,我已经学到了很多东西。好吧,我的问题。

我的文件名采用以下格式: ACP001.jpg,ACP002.jpg,... ACP010.jpg,ACP011.jpg,ACP012_x.jpg,ACP013.jpg,ACP014_x.jpg

pattern = r'(ACP0)(0*)(\d+)(\.jpg)'
replace = r'\3\4'

因此,对于大多数人来说,这都工作得很好...但是,在文件扩展名之前,有些文件带有“ _x”。我对模式和替换模式进行了如下修改

pattern = r'(ACP0)(0*)(\d+)(_w)*(\.jpg)'
replace = r'\3.jpg'

我认为我通过在替换字符串中对“ .jpg”进行硬编码来作弊。在匹配对象组大小可能不同的情况下,我将如何处理?在这个示例中,我基本上希望最后一组和第三组。

2 个答案:

答案 0 :(得分:1)

使_x一词为可选:

pattern = r'(ACP0)(0*)(\d+)(_x)?(\.jpg)'

我实际上不知道为什么您的模式中有这么多捕获组。我会这样写的:

pattern = r'ACP(\d{3})(_x)?\.jpg'

答案 1 :(得分:0)

您可以使用.来匹配换行符以外的任何字符。考虑到OP只想将所有文件重命名为数字(ACP001.jpg-> 1.jpg),则可以使用以下模式并替换为该字符串-

li=['ACP001.txt', 'ACP012.txt', 'ACP013_x.jpg'] # list of filenames
import re # built-in package for regular expressions
pattern = r'(ACP)(0*)(\d+)(.*)(\.\w+)'
replace = r'\3\5'
res = [re.sub(pattern, replace, st) for st in li]
print(res)

输出

['1.txt', '12.txt', '13.jpg']

此代码适用于所有文件扩展名,完全消除了多个组的问题。