Pythonモジュールsearch()
のとmatch()
関数の違いは何ですか?re
ドキュメント(現在のドキュメント)を読みましたが、覚えていないようです。私はそれを調べて再学習しなければなりません。(おそらく)頭に残るように、誰かが例を挙げて明確に答えてくれることを願っています。または、少なくとも、質問を返すためのより良い場所があり、再学習にかかる時間が短縮されます.
re.match
文字列の先頭に固定されます。これは改行とは関係がないため^
、パターンで使用するのと同じではありません。
re.match documentationが言うように:
文字列の先頭にある0 個以上の文字 が正規表現パターンに一致する場合、対応する
MatchObject
インスタンスを返します。None
文字列がパターンに一致しない場合に返します。これは長さゼロの一致とは異なることに注意してください。注: 文字列内の任意の場所で一致を見つけたい場合は、
search()
代わりに を使用します。
re.search
ドキュメントにあるように、文字列全体を検索します。
文字列をスキャンして、正規表現パターンが一致する場所を探し、対応する
MatchObject
インスタンスを返します。None
文字列内のどの位置もパターンに一致しない場合は戻ります。これは、文字列のあるポイントで長さがゼロの一致を見つけることとは異なることに注意してください。
したがって、文字列の先頭で一致する必要がある場合、または文字列全体と一致する必要がある場合は、 を使用しますmatch
。より高速です。それ以外の場合は を使用しますsearch
。
ドキュメントには、複数行の文字列もカバーするvs.の特定のセクションがあります。match
search
Python は、正規表現に基づいた 2 つの異なるプリミティブ操作を提供します:文字列の先頭でのみ
match
一致 をチェックし、文字列内の任意の場所で一致 をチェックします (これは Perl がデフォルトで行うことです)。search
で始まる正規表現を使用した場合でも、:は文字列の先頭のみに一致するか 、改行の直後のモードでも一致する場合と
match
は異なる場合があることに注意してください。「<code>match」操作 は、モードに関係なく文字列の先頭でパターンが一致する場合、または 改行が前にあるかどうかに関係なく、オプションの引数によって指定された開始位置でパターンが一致する場合にのみ成功します。search
'^'
'^'
MULTILINE
pos
さて、十分な話です。サンプル コードを見てみましょう。
# 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
search
⇒ 文字列のどこかで何かを見つけて、一致オブジェクトを返します。
match
⇒ 文字列の先頭にある何かを見つけて、一致オブジェクトを返します。
re.search
文字列全体でパターンを検索しますが、パターンは検索re.match
しません。そうでない場合は、文字列の先頭で一致させる以外に選択肢はありません。
違いは、Perl、grep、またはsedの正規表現マッチングにre.match()
慣れている人を誤解させ、そうではないことです。re.search()
:-)
より冷静に言えば、 John D. Cook が述べているように、re.match()
「すべてのパターンが ^ プリペンドされているかのように動作します」。つまり、re.match('pattern')
等しいre.search('^pattern')
. したがって、パターンの左側を固定します。しかし、それはまた、パターンの右側を固定しません:それはまだ終端を必要とします$
.
re.match()
率直に言って、私は廃止すべきだと思います。保持する理由を知りたいです。
re.matchは、文字列の先頭にあるパターンとの一致を試みます。re.search は、一致が見つかるまで、文字列全体でパターンの一致を試みます。