デフォルトでは、文字は改行と一致し.
ません。re.DOTALL
flagを設定して有効にする必要があります。
>>> 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 つのセットがある場合、 は最初から最後の まですべてのテキストに一致します。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