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

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

我们将不胜感激任何帮助以及对逻辑的解释。

最佳答案

我们将使用一个函数来替换,而不是一个字符串。

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# .

关于python - RegEx 根据模式或分隔符替换字符实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12572518/

相关文章:

ios - 正则表达式从字符串中获取字符串

python - 在 AWS Cloudformation 上调用 ListStacks 时出现验证错误

python - 将数据从数据表传递到模式Django

python - 根据 pandas 的条件将行分成 2 行

python - 如何仅允许特定类的元素成为可迭代的元素(对于自定义类)

c++ - 如何在 C++11 中为包装函数参数解包元组?

Python 使用组合对字典列表中的元组中的值求和?

python - 如何在 python 中获取多个正则表达式匹配项?

php - Perl 正则表达式 X 修饰符的倒数

python - 什么是正则括号的非分组版本