web-dev-qa-db-ja.com

re.searchとre.matchはどう違いますか?

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

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

427
Daryl Spitzer

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

match⇒文字列のの先頭で何かを見つけ、マッチオブジェクトを返します。

re.search search はパターン 全体の - に対して、/ re.matchはしません パターンの検索 そうでなければ、文字列の先頭に match itを付ける以外に選択肢はありません。

46
xilun

matchはsearchよりもはるかに速いので、regex.search( "Word")を実行する代わりに、regex.match((。*?)Word(。*?))を実行して、何百万もの作業をしている場合はパフォーマンスを上げることができます。サンプル.

上記の受け入れられた答え の下の@ivan_bilanからのこのコメントは、そのようなハックが実際に何か高速化しているかどうかを私に考えさせ、それでは、実際にどれだけのパフォーマンスが得られるのかを見てみましょう。

私は以下のテストスイートを用意しました。

import random
import re
import string
import time

LENGTH = 10
LIST_SIZE = 1000000

def generate_Word():
    Word = [random.choice(string.ascii_lowercase) for _ in range(LENGTH)]
    Word = ''.join(Word)
    return Word

wordlist = [generate_Word() for _ in range(LIST_SIZE)]

start = time.time()
[re.search('python', Word) for Word in wordlist]
print('search:', time.time() - start)

start = time.time()
[re.match('(.*?)python(.*?)', Word) for Word in wordlist]
print('match:', time.time() - start)

私は次のプロットを与えた10回の測定(1M、2M、...、10Mワード)を行いました。

match vs. search regex speedtest line plot

結果として得られる線は驚くほど(実際にはそれほど驚くほどではない)直線です。そして、search関数は、この特定のパターンの組み合わせを考えると(わずかに)速くなります。このテストの教訓:コードを過度に最適化しないようにします

25
Jeyekomon

違いは、re.match() Perl grep 、または sedに慣れた人を誤解させることです。 正規表現の一致、およびre.search()の一致はしません。:-)

もっと率直に言って、 John D. Cookが と述べているように、re.match()は「すべてのパターンの前に^が付いているかのように振る舞います」。つまり、re.match('pattern')re.search('^pattern')と同じです。それで、それはパターンの左側を固定します。しかしはパターンの右側を固定するものでもありません:それでも終端の$が必要です。

率直に言って、re.match()は廃止されるべきだと思います。それが保持されるべき理由を知ることに興味があるでしょう。

25
CODE-REaD

あなたはre.matchとre.searchの働きを理解するために以下の例を参照することができます

a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)

re.matchはnoneを返しますが、re.searchはabcを返します。

25
ldR

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

14
cschol

はるかに短い:

  • searchname__は、文字列全体をスキャンします。

  • matchname__文字列の先頭だけを処理します。

Exに続いてそれは言う:

>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc
1
U9-Forward