我试图编写一个Python函数,用大括号的内容替换大括号包围的文本实例,而不使用大括号对。例如:
foo {} bar {baz}
将变成{
我创建的匹配模式是{[^{}]+}
,也就是说,一些文本不包含大括号(以防止重叠匹配),并由一组大括号包围。在
显而易见的解决方案是在我的模式中使用re.sub
,我发现我可以用\g<0>
引用匹配的文本:
>>> re.sub("{[^{}]+}", "A \g<0> B", "foo {} bar {baz}")
'foo {} bar A {baz} B'
所以没问题。然而,我一直在讨论如何从引用的文本中删去方括号。如果我尝试对替换字符串应用范围:
^{pr2}$范围在\g<0>
解析为匹配文本之前应用,它修剪前导\
和尾随{
我还尝试定义一个函数来执行修剪:
def trimBraces(string):
return string[1:-1]
但不出所料,这并没有改变任何东西。在
>>> re.sub("{[^{}]+}", trimBraces("\g<0>"), "foo{}bar{baz}")
'foo{}barg<0'
我错过了什么?提前致谢。在
当您使用
"\g<0>"[1:-1]
作为替换模式时,您只对"\g<0>"
字符串进行切片,而不是此backreference引用的实际值。在如果需要使用“裁剪”方法,则需要将match data对象传递给
re.sub
:见this Python demo。注意,
m.group()
代表模式中的\g<0>
,即整个匹配值。在然而,使用capturing groups是一种更“有机”的解决方案,参见alexce's solution。在
您可以使用捕获组替换部分匹配:
相关问题 更多 >
编程相关推荐