私は正規表現を引き受ける概念的正規表現はDFAとしてモデル化され、入力はすべての一致を消費しているようので、個別にサブストリングごとの検査よりも優れています同時にテストされています(入力文字列を1回スキャンします)。
だから、ここの例である:
import re
def work():
to_find = re.compile("cat|fish|dog")
search_str = "blah fish cat dog haha"
match_obj = to_find.search(search_str)
the_index = match_obj.start() # produces 5, the index of fish
which_word_matched = match_obj.group() # "fish"
# Note, if no match, match_obj is None
UPDATE:代替語の単一パターン内の単語を組み合わせる場合 いくつかの注意が必要です。次のコードは正規表現を構築しますが、escapes any regex special charactersと長い単語が同じ単語のいずれかの短いプレフィックス前に照合するチャンスを得るように言葉を並べ替え:
def wordlist_to_regex(words):
escaped = map(re.escape, words)
combined = '|'.join(sorted(escaped, key=len, reverse=True))
return re.compile(combined)
>>> r.search('smash atomic particles').span()
(6, 10)
>>> r.search('visit usenet:comp.lang.python today').span()
(13, 29)
>>> r.search('a north\south division').span()
(2, 13)
>>> r.search('012cat').span()
(3, 6)
>>> r.search('0123dog789cat').span()
(4, 7)
ENDのUPDATE
それはずできるだけregex(つまり、re.compile()への呼び出し)を形成したいと思うでしょう。最良のケースは、検索結果が何であるかを事前に知っているか(または一度しか/頻繁に計算しないで)、re.compileの結果をどこかに保存することです。私の例は単純なナンセンス関数なので、正規表現の使い方を見ることができます。
http://docs.python.org/library/re.html
・ホープ、このことができます:ここにいくつかのより多くの正規表現のドキュメントがあります。
UPDATE:私は()(たとえば、あなたが "にどのように多くの単語を試すことができますPythonは正規表現を実装する方法について不明な点ですが、re.compileの制限があるかどうかについてのラックスの質問に答えるために| "を一度に一致させるために)、そしてコンパイルを実行する時間の長さ:どちらも問題ではないようです。私はこのコードを試しましたが、それは私を説得するのに十分です。 (タイミングや報告結果を追加するだけでなく、単語のリストをセットに入れて重複がないようにすることで、これをよりうまくできたかもしれません...しかし、これらの改善はどちらも過剰なものです)。このコードは基本的には瞬時に実行され、2000ワード(サイズ10)を検索できることを私に確信させました。そして、それらのワードは適切に一致します。
import random
import re
import string
import sys
def main(args):
words = []
letters_and_digits = "%s%s" % (string.letters, string.digits)
for i in range(2000):
chars = []
for j in range(10):
chars.append(random.choice(letters_and_digits))
words.append(("%s"*10) % tuple(chars))
search_for = re.compile("|".join(words))
first, middle, last = words[0], words[len(words)/2], words[-1]
search_string = "%s, %s, %s" % (last, middle, first)
match_obj = search_for.search(search_string)
if match_obj is None:
print "Ahhhg"
return
index = match_obj.start()
which = match_obj.group()
if index != 0:
print "ahhhg"
return
if words[-1] != which:
print "ahhg"
return
print "success!!! Generated 2000 random words, compiled re, and was able to perform matches."
if __name__ == "__main__":
main(sys.argv)
UPDATE:物事の順序がを重要正規表現で一緒に論理和(OR)ことに留意すべきであるここでは、コードです。/- :
>>> search_str = "01catdog"
>>> test1 = re.compile("cat|catdog")
>>> match1 = test1.search(search_str)
>>> match1.group()
'cat'
>>> match1.start()
2
>>> test2 = re.compile("catdog|cat") # reverse order
>>> match2 = test2.search(search_str)
>>> match2.group()
'catdog'
>>> match2.start()
2
これは注文事項を示唆:TZOTZIOYに触発され、次のテストを見てみましょう。私はこれがRaxのアプリケーションにとって何を意味するのかよくわかりませんが、少なくともその動作はわかっています。
UPDATE:私はうまくいけば、私たちにこの質問に見つかった問題にいくつかの洞察力を与えるであろうthis questions about the implementation of regular expressions in Pythonを掲載。
部分文字列のリストは定数ですか? Regex型のソリューションを使用するには通常、正規表現のいくつかの事前計算が必要です(rsp。あなたのケースでは部分文字列のリスト)。その事前計算は多くの検索で償却されますか? – Accipitridae