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

ont*_*eio 1 python regex tuples os.walk

我刚刚学习并利用正则表达式的强大功能我有一个返回文件的元组列表os.walk(),如下所示:

files = ('s8_00.tif', 's9_00.tif', 's10_000.tif', 's11_00.tif')
Run Code Online (Sandbox Code Playgroud)

我试图让它看起来像这样:

files = ('s8_##.tif', 's9_##.tif', 's10_###.tif', 's11_##.tif')
Run Code Online (Sandbox Code Playgroud)

我试过用这个.

pad2 = re.compile(r'_00?')

for root, dirs, files in seqDirs:
  pad = files[0]  
  p = pad2.sub("#", pad)
  print p
Run Code Online (Sandbox Code Playgroud)

返回:

p = ('s8#.tif', 's9#.tif', 's10#0.tif', 's11#.tif')
Run Code Online (Sandbox Code Playgroud)

所以我把表达式改为:

pad2 = re.compile('(_)0+')
Run Code Online (Sandbox Code Playgroud)

给我:

p = ('s8#.tif', 's9#.tif', 's10#.tif', 's11#.tif')
Run Code Online (Sandbox Code Playgroud)

我的p = pad2.sub功能有问题吗?或者我的编译表达式中存在问题?或者是"_"表达方式正在搞砸它?

我甚pad2.sub至尝试在函数内部传递一些表达式来测试它,当然这并没有真正起作用.我知道我在这里遗漏了一些东西而且我有点卡住了.

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

Mat*_*ias 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)
Run Code Online (Sandbox Code Playgroud)

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

0+ 捕获所有以下零

拉姆达函数替换每次0用#.