我试图编写一个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'
我在这里缺少什么?非常感谢提前。
答案 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。