不止一次用正则表达式替换两个字符串之间的字符串,python

Posted

技术标签:

【中文标题】不止一次用正则表达式替换两个字符串之间的字符串,python【英文标题】:Replacing a string between two strings on more then one occasion with regex, 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 都应该变成“替换字符串”,但是文档变成了

开始版权所有

替换字符串

结束版权

【问题讨论】:

【参考方案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 部分放在那里也不会越界。

【讨论】:

以上是关于不止一次用正则表达式替换两个字符串之间的字符串,python的主要内容,如果未能解决你的问题,请参考以下文章

php正则表达式获取两个字符之间的文字

正则表达式替换 C 块注释之间的字符串

java如何用正则表达式提取#之间的字符串。例如cc#aaaaa#jdi#bbbbb#ji,需要提取aaaaa和bbbbb两个字符串。

PHP:正则表达式替换,同时忽略html标签之间的内容

在pyspark数据框的列中使用正则表达式捕获两个字符串之间的第一次出现的字符串

notepad++如何替换两个字符之间的内容?内容跨行