RegEx基于模式或分隔符替换字符实例

时间:2012-09-24 20:35:40

标签: python regex tuples os.walk

我刚刚学习并利用正则表达式的力量 我有一个从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函数中传递一些表达式来测试它,当然这并没有真正起作用。我知道我在这里遗漏了一些东西而且我有点卡住了。

随着对逻辑的解释,将非常感谢任何和所有帮助。

3 个答案:

答案 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)

你最好找到匹配项,计算它们的长度,然后用#的数量替换它们。