この Python 正規表現は何と一致しますか?
.*?[^\\]\n
の後にとの.
両方が続く理由がわかりません。*
?
*
「前の要素をできるだけ多く(0回以上)一致させる」ことを意味します。
*?
「前の要素をできるだけ少なく(0回以上)一致させる」という意味です。
他の回答はすでにこれに対処していますが、それらが提示しないのは、正規表現を変更する方法です。フラグが提供されている場合は、改行文字が有効になっていると一致するre.DOTALL
ため、大きな違いがあります。.
したがって.*[^\\]\n
、文字列の先頭からバックスラッシュが前に付いていない最後の改行文字まで一致します(したがって、複数の行が一致します)。
フラグが指定されていない場合re.DOTALL
、違いはより微妙で、[^\\]
改行文字を含むバックスラッシュ以外のすべてに一致します。次の例を考えてみましょう。
>>> import re
>>> s = "foo\n\nbar"
>>> re.findall(r'.*?[^\\]\n', s)
['foo\n']
>>> re.findall(r'.*[^\\]\n', s)
['foo\n\n']
したがって、この正規表現の目的は、バックスラッシュで終わらない空でない行を見つけることですが、.*
代わりに使用する場合、空でない行の後に空の行がある場合は.*?
、余分な行と一致します。\n
これは、.*?
にのみ一致しfo
、[^\\]
2番目o
に\n
一致し、最初の行の終わりに一致するために発生します。ただし、.*
は一致foo
し、[^\\]
は一致し\n
て最初の行を終了し、次の\n
行は2行目が空白であるため一致します。
.
ワイルドカードを示します。\n
適切なフラグが使用されていない限り、a 以外のすべてに一致します。
*
は、その前のものを 0 個以上持つことができることを示します。
?
前の量指定子が遅延であることを示します。最初の一致が見つかった後、検索を停止します。
Python re モジュールのドキュメント を開いてを検索すると*?
、次のものが見つかります。
*?
、+?
、??
:、、および修飾子
*
はすべて貪欲です。可能な限り多くのテキストに一致します。この動作が望ましくない場合もあります。REが に対して一致する場合、だけでなく、文字列全体と一致します。修飾子の後に追加すると、非貪欲または最小限の方法で一致が実行されます。できるだけ少ない文字が一致します。前の式で使用すると、 のみが一致します。+
?
<.*>
<H1>title</H1>
<H1>
?
.*?
<H1>