我刚刚学习并利用正则表达式的力量
我有一个从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
函数中传递一些表达式来测试它,当然这并没有真正起作用。我知道我在这里遗漏了一些东西而且我有点卡住了。
随着对逻辑的解释,将非常感谢任何和所有帮助。
答案 0 :(得分:5)
我们将使用一个函数进行替换,而不是字符串。
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
替换每个#
。
答案 1 :(得分:2)
如果您想在任何数字的位置进行,请将正则表达式设为
pattern = re.compile("_(\d+)")
并通过
进行替换 pattern.sub("_"+len("\g<1>")*"#", filename)
在任何正则表达式中,您都可以使用“\ g&lt; 1&gt;”访问用parens捕获的内容对于第一个值,“\ g&lt; 2&gt;”为下一组parens等等。 “\ d +”将在表达式中获得任何数字字符。如果您非常特别想要查找零,则可以将其替换为“_(0 +)”
答案 2 :(得分:0)
你最好找到匹配项,计算它们的长度,然后用#
的数量替换它们。