【问题标题】:Replacing a string between two strings on more then one occasion with regex, python不止一次用正则表达式替换两个字符串之间的字符串,python
【发布时间】:2012-10-08 15:20:06
【问题描述】:

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

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

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

开始版权所有

结束版权

开始版权所有

酒吧

结束版权

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

开始版权所有

替换字符串

结束版权

【问题讨论】:

    标签: python regex replace


    【解决方案1】:

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

    _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 COPYRIGHTBEGIN COPYRIGHT 的开头,因此即使有人忘记将 END COPYRIGHT 部分放在那里也不会越界。

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多