624

Pythonモジュールsearch()のとmatch()関数の違いは何ですか?re

ドキュメント(現在のドキュメント)を読みましたが、覚えていないようです。私はそれを調べて再学習しなければなりません。(おそらく)頭に残るように、誰かが例を挙げて明確に答えてくれることを願っています。または、少なくとも、質問を返すためのより良い場所があり、再学習にかかる時間が短縮されます.

4

8 に答える 8

603

re.match文字列の先頭に固定されます。これは改行とは関係がないため^、パターンで使用するのと同じではありません。

re.match documentationが言うように:

文字列の先頭にある0 個以上の文字 が正規表現パターンに一致する場合、対応するMatchObjectインスタンスを返します。None文字列がパターンに一致しない場合に返します。これは長さゼロの一致とは異なることに注意してください。

注: 文字列内の任意の場所で一致を見つけたい場合は、search() 代わりに を使用します。

re.searchドキュメントにあるように、文字列全体を検索します。

文字列をスキャンして、正規表現パターンが一致する場所を探し、対応するMatchObjectインスタンスを返します。None文字列内のどの位置もパターンに一致しない場合は戻ります。これは、文字列のあるポイントで長さがゼロの一致を見つけることとは異なることに注意してください。

したがって、文字列の先頭で一致する必要がある場合、または文字列全体と一致する必要がある場合は、 を使用しますmatch。より高速です。それ以外の場合は を使用しますsearch

ドキュメントには、複数行の文字列もカバーするvs.の特定のセクションがあります。matchsearch

Python は、正規表現に基づいた 2 つの異なるプリミティブ操作を提供します:文字列の先頭でのみmatch一致 をチェックし、文字列内の任意の場所で一致 をチェックします (これは Perl がデフォルトで行うことです)。search

で始まる正規表現を使用した場合でも、:は文字列の先頭のみに一致するか 、改行の直後のモードでも一致する場合とmatchは異なる場合があることに注意してください。「<code>match」操作 は、モードに関係なく文字列の先頭でパターンが一致する場合、または 改行が前にあるかどうかに関係なく、オプションの引数によって指定された開始位置でパターンが一致する場合にのみ成功します。search'^''^'MULTILINEpos

さて、十分な話です。サンプル コードを見てみましょう。

# example code:
string_with_newlines = """something
someotherthing"""

import re

print re.match('some', string_with_newlines) # matches
print re.match('someother', 
               string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, 
               re.MULTILINE) # also won't match
print re.search('someother', 
                string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, 
                re.MULTILINE) # also finds something

m = re.compile('thing$', re.MULTILINE)

print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines, 
               re.MULTILINE) # also matches
于 2008-10-08T00:53:12.117 に答える
125

search⇒ 文字列のどこかで何かを見つけて、一致オブジェクトを返します。

match⇒ 文字列の先頭にある何かを見つけて、一致オブジェクトを返します。

于 2011-12-31T12:05:43.113 に答える
57

re.search 文字列全体でパターンを検索しますが、パターンは検索re.matchしません。そうでない場合は、文字列の先頭で一致させる以外に選択肢はありません。

于 2008-10-08T01:07:26.490 に答える
35

違いは、Perlgrep、またはsedの正規表現マッチングにre.match()慣れている人を誤解させ、そうではないことです。re.search():-)

より冷静に言えば、 John D. Cook が述べているように、re.match()「すべてのパターンが ^ プリペンドされているかのように動作します」。つまり、re.match('pattern')等しいre.search('^pattern'). したがって、パターンの左側を固定します。しかし、それはまた、パターンの右側を固定しません:それはまだ終端を必要とします$.

re.match()率直に言って、私は廃止すべきだと思います。保持する理由を知りたいです。

于 2016-05-21T13:28:47.277 に答える
17

re.matchは、文字列の先頭にあるパターンとの一致を試みます。re.search は、一致が見つかるまで、文字列全体でパターンの一致を試みます。

于 2008-10-08T00:54:57.620 に答える