Python re
モジュール のsearch()
関数とmatch()
関数の違いは何ですか?
ドキュメント ( 現在のドキュメント )を読んだことがありますが、覚えているようです。私はそれを調べてそれを再学習し続けなければなりません。私の頭の中に(おそらく)それが残るように、誰かが例を使ってそれに明確に答えることを望んでいます。それとも少なくとも私は私の質問を返すためのより良い場所があるでしょうし、それを再学習するのにかかる時間が短くなります。
search
⇒文字列中のどこかにあるものを見つけて、一致オブジェクトを返します。
match
⇒文字列のの先頭で何かを見つけ、マッチオブジェクトを返します。
re.search
search はパターン 全体の - に対して、/ re.match
はしません パターンの検索 そうでなければ、文字列の先頭に match itを付ける以外に選択肢はありません。
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ワード)を行いました。
結果として得られる線は驚くほど(実際にはそれほど驚くほどではない)直線です。そして、search
関数は、この特定のパターンの組み合わせを考えると(わずかに)速くなります。このテストの教訓:コードを過度に最適化しないようにします。
違いは、re.match()
が Perl 、 grep 、または sedに慣れた人を誤解させることです。 正規表現の一致、およびre.search()
の一致はしません。:-)
もっと率直に言って、 John D. Cookが と述べているように、re.match()
は「すべてのパターンの前に^が付いているかのように振る舞います」。つまり、re.match('pattern')
はre.search('^pattern')
と同じです。それで、それはパターンの左側を固定します。しかしはパターンの右側を固定するものでもありません:それでも終端の$
が必要です。
率直に言って、re.match()
は廃止されるべきだと思います。それが保持されるべき理由を知ることに興味があるでしょう。
あなたはre.matchとre.searchの働きを理解するために以下の例を参照することができます
a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)
re.matchはnoneを返しますが、re.searchはabcを返します。
re.matchはパターン文字列の先頭とのマッチングを試みます。 re.searchは、一致が見つかるまでパターン文字列全体の一致を試みます。
はるかに短い:
search
name__は、文字列全体をスキャンします。
match
name__文字列の先頭だけを処理します。
Exに続いてそれは言う:
>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc