Python正则表达式将方括号内的文本替换为方括号的内容

2024-10-03 04:27:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个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'

我错过了什么?提前致谢。在


Tags: 实例函数字符串文本re内容stringfoo
2条回答

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

如果需要使用“裁剪”方法,则需要将match data对象传递给re.sub

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

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

然而,使用capturing groups是一种更“有机”的解决方案,参见alexce's solution。在

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

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

相关问题 更多 >