我正在寻找一个python正则表达式,它将用pattern
和end
之间的replace_pattern
替换所有出现的start
。
示例:
start fkdsjflsd pattern jdflsdjf pattern end
威尔·耶尔德
start fkdsjflsd replace_pattern jdflsdjf replace_pattern end
我在一个for
循环中成功地做到了这一点:
pattern = 'start(?P<before1>.*)' + pattern
while re.findall(pattern, content, flags=re.DOTALL | re.IGNORECASE):
repl = 'start\g<before1>' + replace_pattern
content = re.sub(pattern, repl, content, flags=re.DOTALL | re.IGNORECASE)
发布于 2014-11-10 04:17:31
如果开始和结束字符串或正确括起来,那么您可以使用下面的正则表达式来匹配字符串pattern
。然后通过pattern
函数用replace_pattern
替换匹配的字符串re.sub
。
(?<!\S)pattern(?!\S)(?=(?:(?!(?<!\S)(?:start|end)(?!\S)).)*?(?<!\S)end(?!\S))
In [6]: import re
In [7]: s = "pattern foo start fkdsjflsd pattern jdflsdjf pattern end pattern"
In [8]: re.sub(r'(?<!\S)pattern(?!\S)(?=(?:(?!(?<!\S)(?:start|end)(?!\S)).)*?(?<!\S)end(?!\S))', r'replace_pattern', s)
Out[8]: 'pattern foo start fkdsjflsd replace_pattern jdflsdjf replace_pattern end pattern'
发布于 2014-11-10 04:14:56
\bpattern\b(?=(?:(?!\bend\b|\bstart\b).)*\bend\b(?:(?:(?!\bstart\b|\bend\b).)*\bstart\b(?:(?!\bend\b|\bstart\b).)*\bend\b)*(?:(?!\bstart\b|\bend\b).)*$)
尝试this.See演示。
http://regex101.com/r/tF5fT5/30
import re
p = re.compile(ur'pattern(?=(?:(?!\bend\b|\bstart\b).)*\bend\b(?:(?:(?!\bstart\b|\bend\b).)*\bstart\b(?:(?!\bend\b|\bstart\b).)*\bend\b)*(?:(?!\bstart\b|\bend\b).)*$)', re.IGNORECASE)
test_str = u"pattern start fkdsjflsd pattern jdflsdjf pattern end pattern"
subst = u"replace_pattern"
result = re.sub(p, subst, test_str)
发布于 2014-11-10 04:30:33
有一种方法:
>>> import re
>>> a='start fkdsjflsd pattern jdflsdjf pattern end'
>>> re.sub(r'(start\s+.*?)pattern\s+(.*?end)',r'\1 replace_pattern \2',a)
'start fkdsjflsd replace_pattern jdflsdjf pattern end'
https://stackoverflow.com/questions/26843404
复制