用regex,python多次替换两个字符串之间的字符串

Dan*_*son 2 python regex replace

我正在尝试使用正则表达式来查找和替换文件中两个字符串之间的文本字符串.我遇到的问题是我希望它在找到"结束"字符串后"中断",而是替换第一个"开始"字符串和最后一个"结束"字符串之间的所有文本.

_copyright = 'BEGIN COPYRIGHT \n The replacing string \n END COPYRIGHT'

_file = re.sub(r'BEGIN COPYRIGHT[\w\s]*END COPYRIGHT',_copyright, _file)
Run Code Online (Sandbox Code Playgroud)

开始版权

FOO

结束版权

开始版权

酒吧

结束版权

所以foo和bar都应该成为"替换字符串",但文档变成了

开始版权

替换字符串

结束版权

Tim*_*ker 5

至少,你需要使星形量词变得懒惰:

_file = re.sub(r'BEGIN COPYRIGHT[\w\s]*?END COPYRIGHT',_copyright, _file)
Run Code Online (Sandbox Code Playgroud)

否则,[\w\s]*将贪婪地匹配尽可能多的字符,包括任何干预END COPYRIGHT/BEGIN COPYRIGHT序列.

另一种更明确的方法是:

_file = re.sub(r'''(?x)BEGIN COPYRIGHT
                   (?:(?!(?:END|BEGIN) COPYRIGHT)[\w\s])*
                   END COPYRIGHT''',_copyright, _file)
Run Code Online (Sandbox Code Playgroud)

后者的版本相匹配[\w\s],只有当它是不是在字符串的开始END COPYRIGHTBEGIN COPYRIGHT,因此不会超越它的界限,即使有人忘了把END COPYRIGHT部分存在.