2

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

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

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

开始版权

食品

结束版权

开始版权

酒吧

结束版权

所以 foo 和 bar 都应该变成“替换字符串”,但是文件变成了

开始版权

替换字符串

结束版权

4

1 回答 1

5

至少,您需要使星量词变得惰性:

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

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

另一种稍微更明确的方法是这样做:

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

[\w\s]后一个版本仅在它不在子字符串的开头时匹配,END COPYRIGHT或者BEGIN COPYRIGHT因此即使有人忘记将END COPYRIGHT部分放在那里也不会超出其范围。

于 2012-10-08T15:21:39.080 回答