2012-02-10 6 views
1

私は置き換えたい複数の行の文字列を持っていますが、なぜ機能していないのかわかりません。何らかの理由で、文字列のピリオドが正規表現の一致を停止します。ピリオドでマルチライン正規表現の代用を停止しますか?

マイ文字列:

s = """ 
[some_previous_text] 
foo 
[some_text_after] 
""" 

私が最初に試したが、それは何も一致していないもの::

>>> import re 
>>> s = "<start>\none_period .\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
<start> 
one_period . 
<end> 
私はで終わるしたいのですがどのような

s = """ 
[some_previous_text] 
<start> 
one_period . 
<end> 
[some_text_after] 
""" 

しかし、私は期間を使い切ったとき、それは正常に働いた:

私は期間前に <end>タグを入れたときに
>>> import re 
>>> s = "<start>\nno_period\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
foo 

はまた、それは最初<end>タグをマッチ:

>>> import re 
>>> s = "<start>\n<end>\none_period .\n<end>" 
>>> print re.sub("<start>[^.]*<end>", "foo", s) 
foo 
one_period . 
<end> 

だから何がここで起こっているの?なぜ期間が[^.]*のマッチングを停止するのですか?

EDIT:

は、私が誤っカラット^は、新しいラインマッチングのためだったと思っ

を解決しました。私が必要としたのはre.DOTALLフラグ(Amberで示されている)でした。ここで私が今使っている表現です:

>>> import re 
>>> s = "<start>\none_period .\n<end>" 
>>> print re.sub("<start>.*<end>", "foo", s, flags=re.DOTALL) 
foo 

答えて

3

なぜでしょうか? [^.]は「.ではないすべての文字の集合」であり、したがってピリオドは一致しません。おそらく、あなただけではなく、代わりに[^.]*の(任意の数の任意の文字を).*を置くことを意味し


?改行を越えマッチングのための

re.DOTALLを指定:

re.sub("<start>.*<end>", "foo", s, flags=re.DOTALL) 
+0

と一致しません。つまり、re.sub( "。* "、 "foo"、s) ')と一致しません。正しい代入式は何でしょうか? – user749618

+0

行間で '.'をマッチさせるには、' re.DOTALL'フラグを使う必要があります。 http://docs.python.org/library/re.html#re。DOTALL – Amber

+0

're.sub(" 。* "、" foo "、s、flags = re.DOTALL)'作品!どうもありがとう。 – user749618

1

ザッツ[^.]*は任意の文字が、期間と一致する否定文字クラスであるため。

re.S修飾子と一緒に<start>.*?<end>のようなものを使用すると、ドットが改行文字にも一致します。

re.sub("<start>.*?<end>", "foo", s, flags=re.S) 
+0

をだから何が使用する正しい表現でしょうか? – user749618

+0

@ user749618私は自分の答えを更新しました。 're.S'はAmberが提案した' re.DOTALL'と同じです。 – stema

+0

're \()'は、Python 2.7またはPython 3.1+でflags引数のみを受け取ります。その前にフラグセットで正規表現をコンパイルするか、 '[\ s \ S] *のようなものを使用する必要がありますか? '。*?'の代わりに。しかし、 '。*'を使用すると –

関連する問題