Skip to main content
 首页 » 编程设计

python之RegEx 根据模式或分隔符替换字符实例

2025年05月04日14youxin

我最近才开始学习和利用正则表达式的强大功能 我有一个从 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与 # .