默认情况下,该.
字符不匹配换行符。您需要通过设置re.DOTALL
标志来启用它。
>>> text = "line1\nline2\nstart\nline3\nline4\nline5\nline6\nend\nline7\nline8"
>>> print re.sub(r'start(.*)end', '', text, flags=re.DOTALL)
line1
line2
line7
line8
注意中间有一个空行;您还需要在之后 end
包含换行符:
>>> print re.sub(r'start(.*)end\n', '', text, flags=re.DOTALL)
line1
line2
line7
line8
作为 的替代方案.
,您还可以同时使用两个相反的字符类:
>>> print re.sub(r'start([\s\S]*)end\n', '', text)
line1
line2
line7
line8
在这里\s
并\S
一起捕获所有字符,包括换行符,而不设置DOTALL
标志。
你可能想让你的匹配不贪心。如果您的输入中有两组和start
行end
,那么.*
将匹配从第一个start
一直到最后一个的所有文本end
:
>>> text = 'line1\nstart\nline2\nend\nline3\nstart\nline4\nend\nline5'
>>> print text
line1
start
line2
end
line3
start
line4
end
line5
>>> print re.sub(r'start(.*)end\n', '', text, flags=re.DOTALL)
line1
line5
注意怎么line3
也消失了。*
通过添加问号来更改,使其不贪婪:
>>> print re.sub(r'start(.*?)end\n', '', text, flags=re.DOTALL)
line1
line3
line5