1

start一致する単語の間およびend一致する単語を含む行を削除するにはどうすればよいですか。

line1
line2
start
line3
line4
line5
line6
end
line7
line8

私が期待する結果は次のとおりです。

line1
line2
line7
line8

次のコードを試しましたが、何も機能していないようです。

text = "line1\nline2\nstart\nline3\nline4\nline5\nline6\nend\nline7\nline8"
print re.sub(r'start(.*)end', '',  text)
4

2 に答える 2

4

一致する改行re.DOTALLを作成するには、修飾子を使用する必要があります。(.*)

re.sub(r'start(.*)end', '',  text, flags=re.DOTALL)

そして、次の(.*?)ような場合に備えて、遅延を使用する方が安全だと思います。

line1\nstart\nline2\nline3\nend\nline4\nline5\nstart\nline6\nend\nline7

これがなければ、最初から最後まで(.*?)のすべてを削除し、その間と途中ではない部分を含みます:startendstartend

re.sub(r'start.*?end', '',  text, flags=re.DOTALL)

最後に、ここでは実際には必要ないため、括弧を削除します。

残っているすべての空白を削除する場合は、次のように使用\s*してそれらをトリミングします。

re.sub(r'start.*?end\s*', '',  text, flags=re.DOTALL)
于 2013-10-05T12:27:39.010 に答える
1

デフォルトでは、文字は改行と一致し.ません。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
于 2013-10-05T12:24:58.033 に答える