用re.sub替换多行模式

时间:2018-11-08 13:13:05

标签: python regex

在以下字符串中,我想用BeginHello...EndHello替换所有包含haha的{​​{1}}块:

''

此代码:

s = """BeginHello
sqdhaha
fsqd
EndHello

BeginHello
1231323
EndHello

BeginHello
qsd
qsd
haha
qsd
EndHello
BeginHello
azeazezae
azeaze
EndHello
"""

在这里不起作用:不会删除任何内容。

如何在Python import re s = re.sub(r'BeginHello.*haha.*EndHello', '', s) print s 上将这种正则表达式用于多行模式?

2 个答案:

答案 0 :(得分:1)

我们可以尝试使用以下模式进行匹配:

BeginHello((?!\bEndHello\b).)*?haha.*?EndHello

这与首字母BeginHello相匹配。然后,它使用一个回火点:

((?!\bEndHello\b).)*?

消耗任何东西,只要我们不击中EndHello。该点也是惰性的,将在击中haha之前停止。有效地,使用上面的点意味着我们只会消耗而不击中EndHellohaha。然后,假设到目前为止匹配成功,我们将消耗haha,然后消耗最近的EndHello

s = re.sub(r'BeginHello((?!\bEndHello\b).)*?haha.*?EndHello', '', s,
    flags=re.DOTALL)
print s



BeginHello
1231323
EndHello


BeginHello
azeazezae
azeaze
EndHello

答案 1 :(得分:-1)

您想要re.DOTALL。这基本上允许.匹配包括\n

在内的任何字符
import re
s = re.sub(r'BeginHello.*?haha.*?EndHello', '', s, flags=re.DOTALL)
print s