我最近才开始学习和利用正则表达式的强大功能
我有一个从 os.walk()
返回的文件元组列表,如下所示:
files = ('s8_00.tif', 's9_00.tif', 's10_000.tif', 's11_00.tif')
我试图让它看起来像这样:
files = ('s8_##.tif', 's9_##.tif', 's10_###.tif', 's11_##.tif')
我试过用这个。
pad2 = re.compile(r'_00?')
for root, dirs, files in seqDirs:
pad = files[0]
p = pad2.sub("#", pad)
print p
返回:
p = ('s8#.tif', 's9#.tif', 's10#0.tif', 's11#.tif')
所以我把表达方式改成了:
pad2 = re.compile('(_)0+')
给我:
p = ('s8#.tif', 's9#.tif', 's10#.tif', 's11#.tif')
问题出在我的p = pad2.sub
函数上吗?还是我编译的表达式中存在问题?还是表达式中的 “_”
搞砸了?
我什至尝试在 pad2.sub
函数中传递一些表达式来测试它,当然这并没有真正起作用。我知道我在这里遗漏了一些东西,而且我有点卡住了。
我们将不胜感激任何帮助以及对逻辑的解释。
最佳答案
我们将使用一个函数来替换,而不是一个字符串。
def replacer(data):
return re.sub(r'(?<=_)(0+)', lambda m: m.group(0).replace('0', '#'), data)
files = ('s8_000.tif', 's9_00.tif', 's10_000.tif', 's11_00.tif')
map(replacer, files)
print(files)
?<=
是一个积极的回顾断言。您可以在 Regular Expression Syntax 的文档中找到解释。 .
0+
捕获所有后续零
lambda 函数替换每个 0
与 #
.
关于python - RegEx 根据模式或分隔符替换字符实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12572518/