首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用带有可选组的正则表达式的sub()方法?

如何使用带有可选组的正则表达式的sub()方法?
EN

Stack Overflow用户
提问于 2018-09-10 09:38:18
回答 2查看 48关注 0票数 0

我已经为这个文件重命名程序做了几天了。我学到了很多,多亏了我之前在这个网站上问过的所有“愚蠢”的问题,以及他们所得到的高质量的答案。关于我的问题。

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

代码语言:javascript
复制
pattern = r'(ACP0)(0*)(\d+)(\.jpg)'
replace = r'\3\4'

所以这对他们大多数人来说都很好..。但也有一些在文件扩展名之前有"_x“。我对模式和替换模式进行了如下验证

代码语言:javascript
复制
pattern = r'(ACP0)(0*)(\d+)(_w)*(\.jpg)'
replace = r'\3.jpg'

我认为我是通过硬编码替换字符串中的".jpg“来作弊的。当match对象组可能大小不同时,我将如何处理这些情况?在这个例子中,我基本上想要最后一个组和第三个组。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 10:04:32

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

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
['1.txt', '12.txt', '13.jpg']

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

票数 0
EN

Stack Overflow用户

发布于 2018-09-10 09:40:12

使_x术语具有可选性:

代码语言:javascript
复制
pattern = r'(ACP0)(0*)(\d+)(_x)?(\.jpg)'

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

代码语言:javascript
复制
pattern = r'ACP(\d{3})(_x)?\.jpg'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52254944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档