1

我有一个类似的字符串longstring-abc{something goes here},我想用 . 替换大括号内的abc部分replacement。(所以应该是longstring-abc{replacement}。我正在尝试使用该re.sub功能:

re.sub(r'abc\{(.*)\}', r'replacement', r'mylongstring-abc\{def\}')

所以我正在尝试寻找模式abc\{(.*)\}并将里面的内容替换(...)replacement. 但这只是将原始字符串返回给我。我怎样才能使它正确?

4

1 回答 1

4

首先,一个小故障:你不需要在 RE 中转义花括号;他们代表自己。此外,如果您在字符串本身中转义它们,您将在字符串中插入实际的反斜杠,并且您的 RE 也必须匹配它们。

其次,对于您的问题:匹配足够的字符串以确保您不会错误匹配。整个东西都将被替换,所以如果你只想在大括号内替换,请使用一个组来捕获并重用你更改的部分:

re.sub(r'(abc){.*}', r'\1{replacement}', 'mylongstring-abc{def}')

或者,如果“abc”部分是固定的,你可以简单地包含它:

re.sub(r'abc{.*}', r'abc{replacement}', 'mylongstring-abc{def}')

.*请注意,除非您在替换字符串中使用它,否则您不需要一个组。

顺便说一句,如果同一行上有另一个右大括号,您的模式将匹配太多。要在第一个右大括号处停止,请使用r"(abc){[^}]*}"r"(abc){.*?}"。后者是一颗“不贪心”的明星:它匹配的越少越好。

于 2013-05-28T22:38:28.427 回答