Python正则表达式 - 用括号内容替换括号内的文本

时间:2016-08-03 04:19:33

标签: python regex string substitution backreference

我试图编写一个Python函数,用大括号的内容替换用花括号括起来的文本实例,同时留下空的大括号对。例如:

foo {} bar {baz}将成为foo {} bar baz

我创建的与此匹配的模式是{[^{}]+},即一些文本不包含花括号(以防止重叠匹配)被一组花括号包围。

显而易见的解决方案是在我的模式中使用re.sub,并且我发现我可以使用\g<0>引用匹配的文字:

>>> re.sub("{[^{}]+}", "A \g<0> B", "foo {} bar {baz}")
'foo {} bar A {baz} B'

这样没问题。但是,我仍然坚持如何修剪引用文本中的括号。如果我尝试将范围应用于替换字符串:

>>> re.sub("{[^{}]+}", "\g<0>"[1:-1], "foo{}bar{baz}")
'foo{}barg<0'

在将\g<0>解析为匹配文字之前应用该范围,并修剪前导\并尾随>,只留下g<0,但没有特殊意义。

我还尝试定义一个函数来执行修剪:

def trimBraces(string):
    return string[1:-1]

但不出所料,这并没有改变任何事情。

>>> re.sub("{[^{}]+}", trimBraces("\g<0>"), "foo{}bar{baz}")
'foo{}barg<0'

我在这里缺少什么?非常感谢提前。

2 个答案:

答案 0 :(得分:3)

您可以使用捕获组替换匹配的一部分:

>>> re.sub(r"{([^{}]+)}", r"\1", "foo{}bar{baz}")
'foo{}barbaz'
>>> re.sub(r"{([^{}]+)}", r"\1", "foo {} bar {baz}")
'foo {} bar baz'

答案 1 :(得分:2)

当您使用"\g<0>"[1:-1]作为替换模式时,您只会对"\g<0>" 字符串进行切片,而不是此反向引用所指的实际值。

如果您需要使用&#34;修剪&#34;方法,您需要将匹配数据对象传递给re.sub

re.sub("{[^{}]+}", lambda m: m.group()[1:-1], "foo{}bar{baz}")
# => foo{}barbaz

this Python demo。请注意,m.group()代表模式中的\g<0>,即整个匹配值。

然而,使用capturing groups更多&#34;有机&#34;解决方案,请参阅alexce's solution