我有一个像longstring-abc{something goes here}
这样的字符串,我希望在abc
之后用replacement
替换大括号内的部分。 (所以它应该是longstring-abc{replacement}
。我正在尝试使用re.sub
函数:
re.sub(r'abc\{(.*)\}', r'replacement', r'mylongstring-abc\{def\}')
所以我正在尝试查找模式abc\{(.*)\}
并将(...)
内的内容替换为replacement
。但这只是给我原来的字符串。我怎样才能使它正确?
答案 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){.*?}"
。后者是一个“非贪婪”的明星:它尽可能少地匹配。