Một trong những giải pháp hiệu quả nhất là sử dụng Aho–Corasick string matching algorithm và là thuật toán không phát triển được thiết kế cho loại sự cố này. (tìm kiếm nhiều chuỗi được xác định trước trong văn bản không xác định)
Có gói sẵn có cho việc này.
https://pypi.python.org/pypi/ahocorasick/0.9
https://hkn.eecs.berkeley.edu/~dyoo/python/ahocorasick/
Edit: Ngoài ra còn có các gói gần đây có sẵn (nơi ẩn náu cố gắng nào của họ) https://pypi.python.org/pypi/pyahocorasick/1.0.0
Extra:
Tôi đã thực hiện một số thử nghiệm hiệu suất với pyahocorasick và nó là nhanh hơn python lại khi tìm kiếm hơn 1 từ trong dict (2 hoặc nhiều hơn).
Dưới đây là mã:
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)
Nguồn
2015-05-21 10:35:42
Xây dựng một biểu thức chính quy. –
Mối quan tâm của tôi là sẽ mất rất nhiều thời gian để phù hợp. –
Có thể mất rất nhiều thời gian, nhưng điều đó không có nghĩa là nó chậm. –