正则表达式:如何使用具有可变数量元素的re.sub?

时间:2018-10-16 10:33:47

标签: python regex python-3.x python-3.5

我试图用“ x或y”替换文本语料库中的{x; y}模式,除了元素的数量是可变的,因此有时会有3个或更多的元素,即{x; y; z}(最大为9)。

我正在尝试使用正则表达式执行此操作,但是我不确定如何执行此操作,以便可以根据存在的元素数进行替换。所以我的意思是,例如,如果我将正则表达式与类似以下内容的可变组件一起使用

part = '(;[\w\s]+)' regex = '\(([\w\s]+);([\w\s]+){}?\)'.format(part) re.sub(regex,/1 or /2 or /3, text)

当花括号中只有2个元素时,我有时会得到一个额外的“或”(如果增加可变元素的数量,则更多),而我不希望这样。替代方法是使用不同数量的可变部分多次执行此操作,但是代码非常笨拙。我想知道是否可以通过正则表达式方法实现此目的?将不胜感激。

我将python3.5与spyder一起使用。

1 个答案:

答案 0 :(得分:1)

这种情况对于常规的搜索和替换操作来说有点过分了,所以我建议传入一个函数来动态生成替换字符串。

import re

text = 'There goes my {cat;dog} playing in the {street;garden}.'

def replacer(m):
    return m.group(1).replace(';', ' or ')

output = re.sub(r'\{((\w;?)*\w)\}', replacer, text)

print(output)

输出:

  

我的猫或狗在街上或花园里嬉戏玩耍。