1. ホーム
  2. python

[解決済み] re.searchとre.matchの違いは何ですか?

2022-03-16 11:02:42

質問

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

を読みました。 ドキュメント ( 現在のドキュメント )を覚えていないようです。 調べたり、覚え直したりしています。 誰かが例を挙げて明確に答えてくれて、(たぶん)頭に定着してくれることを期待しています。 あるいは、少なくとも、私が質問を返すより良い場所ができ、再学習にかかる時間が少なくなることでしょう。

どのように解決するのですか?

re.match は文字列の先頭に固定されています。これは改行とは無関係なので ^ をパターンに含めることができます。

として re.match ドキュメント と書かれています。

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

注:マッチする場所を特定したい場合 文字列の任意の場所で search() の代わりに

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

文字列のスキャンスルー を探します。 正規表現 パターンがマッチし 対応する MatchObject のインスタンスです。 返す None の中に位置がない場合は 文字列がパターンにマッチすることに注意してください。 を見つけることとは異なります。 のある時点で長さゼロのマッチが発生します。 の文字列を使用します。

したがって、文字列の先頭でマッチングする必要がある場合、または文字列全体でマッチングする場合は、次のようにします。 match . その方が速いです。それ以外の場合は search .

ドキュメントには の具体的なセクションがあります。 match 対して search は、複数行の文字列もカバーするものです。

Pythonは2つの異なるプリミティブ をベースにした の式で表されます。 match にマッチするかどうかをチェックします。 のみである。 という文字列があります。 一方 search が一致するかどうかをチェックします。 どこでも という文字列があります(これは Perlはデフォルトでそうします)。

なお match とは異なる場合があります。 search 正規表現を使っても で始まる '^' : '^' にのみマッチします。 文字列の先頭、または MULTILINE モードでも の後、改行されます。このとき、" match " の操作は成功します。 パターン でマッチします。 開始 文字列の モードに関係なく、あるいは オプションで指定された 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