デフォルトでは、文字は改行と一致し.ません。re.DOTALLflagを設定して有効にする必要があります。
>>> 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
の代わりに.、2 つの反対の文字クラスを一緒に使用することもできます。
>>> print re.sub(r'start([\s\S]*)end\n', '', text)
line1
line2
line7
line8
ここで、フラグを設定せずに、改行を含むすべての\s文字を\Sまとめてキャプチャします。DOTALL
マッチを非貪欲にしたいかもしれません。入力にと行の2 つのセットがある場合、 は最初から最後の まですべてのテキストに一致します。startend.*startend
>>> 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