Jednym z najbardziej skutecznych rozwiązań jest użycie Aho–Corasick string matching algorithm i jest to nietrywialny algorytm zaprojektowany dla tego rodzaju problemów. (wyszukiwanie wielu predefiniowanych ciągów znaków w nieznanym tekście)
Dostępny jest pakiet.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/
Edit: Są też nowsze pakiety dostępne (przystań próbował żadnego z nich) https://pypi.python.org/pypi/pyahocorasick/1.0.0
Dodatkowe:
Podjąłem kilka testów wydajności z pyahocorasick i to szybciej niż python re podczas wyszukiwania więcej niż 1 słowa w dyktacie (2 lub więcej).
Tutaj jest kod:
import re, ahocorasick,random,time
# search N words from dict
N=3
#file from http://norvig.com/big.txt
with open("big.txt","r") as f:
text = f.read()
words = set(re.findall('[a-z]+', text.lower()))
search_words = random.sample([w for w in words],N)
A = ahocorasick.Automaton()
for i,w in enumerate(search_words):
A.add_word(w, (i, w))
A.make_automaton()
#test time for ahocorasic
start = time.time()
print("ah matches",sum(1 for i in A.iter(text)))
print("aho done in ", time.time() - start)
exp = re.compile('|'.join(search_words))
#test time for re
start = time.time()
m = exp.findall(text)
print("re matches",sum(1 for _ in m))
print("re done in ",time.time()-start)
zbudować wyrażenie regularne. –
Obawiam się, że dopasowanie zajmie dużo czasu. –
To może zająć dużo czasu, ale to nie znaczy, że jest wolne. –