用正则表达式替换

时间:2013-05-28 22:06:53

标签: python regex

我有一个像longstring-abc{something goes here}这样的字符串,我希望在abc之后用replacement替换大括号内的部分。 (所以它应该是longstring-abc{replacement}。我正在尝试使用re.sub函数:

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

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

1 个答案:

答案 0 :(得分: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){.*?}"。后者是一个“非贪婪”的明星:它尽可能少地匹配。