1

我最近才在学习和利用正则表达式的力量,我有一个从 返回的文件的元组列表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来测试它,当然这并没有真正起作用。我知道我在这里遗漏了一些东西,我有点卡住了。

任何和所有的帮助将不胜感激以及对逻辑的解释。

4

3 回答 3

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)

?<=是一个积极的后向断言您可以在正则表达式语法的文档中找到解释。

0+捕获所有随后的零

lambda 函数将 every 替换0#.

于 2012-09-24T21:00:23.610 回答
2

如果你想在可能有任何数字的地方做,让你的正则表达式成为

pattern = re.compile("_(\d+)")

并通过

pattern.sub("_"+len("\g<1>")*"#", filename)

在任何正则表达式中,您都可以访问使用“\g<1>”作为第一个值的括号捕获的内容,“\g<2>”作为下一组括号等等。"\d+" 将获得表达式中的任何数字字符。如果您特别想查找零,可以将其替换为“_(0+)”

于 2012-09-24T20:41:57.757 回答
0

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

于 2012-09-24T20:54:57.970 回答