tôi sẽ giả định một regex là tốt hơn so với kiểm tra cho mỗi substring riêng vì khái niệm biểu thức chính quy được mô phỏng như một DFA, và như vậy là đầu vào được tiêu thụ tất cả các trận đấu đang được thử nghiệm cùng một lúc (dẫn đến một lần quét chuỗi đầu vào).
Vì vậy, đây là một ví dụ:
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: Một số dịch vụ chăm sóc cần được thực hiện khi kết hợp các từ trong một mô hình duy nhất của từ thay thế. Các mã sau đây được xây dựng một regex, nhưng escapes any regex special characters và sắp xếp các từ để từ còn có cơ hội để phù hợp trước khi bất kỳ tiền tố ngắn hơn của cùng một từ:
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 CẬP NHẬT
Nó nên lưu ý rằng bạn sẽ muốn tạo thành regex (tức là - gọi lại đến re.compile()) càng ít càng tốt. Trường hợp tốt nhất sẽ là bạn biết trước thời gian tìm kiếm của bạn là gì (hoặc bạn tính toán chúng một lần/không thường xuyên) và sau đó lưu kết quả của re.compile ở đâu đó. Ví dụ của tôi chỉ là một hàm vô nghĩa đơn giản để bạn có thể thấy việc sử dụng regex. Có một số tài liệu regex thêm ở đây:
http://docs.python.org/library/re.html
Hope this helps.
UPDATE: Tôi không chắc chắn về cách python thực hiện biểu thức thông thường, nhưng để trả lời câu hỏi Rax của về việc có hay không có những hạn chế của re.compile() (ví dụ, có bao nhiêu từ bạn có thể cố gắng " | "cùng nhau để phù hợp cùng một lúc), và số lượng thời gian để chạy biên dịch: không phải trong số này có vẻ là một vấn đề. Tôi đã thử mã này, đủ tốt để thuyết phục tôi. (Tôi có thể làm điều này tốt hơn bằng cách thêm thời gian và kết quả báo cáo, cũng như ném danh sách các từ vào một tập hợp để đảm bảo không có bản sao ... nhưng cả hai cải tiến này dường như quá mức cần thiết). Mã này chạy cơ bản ngay lập tức, và thuyết phục tôi rằng tôi có thể tìm kiếm 2000 từ (kích thước 10), và điều đó và của chúng sẽ phù hợp một cách thích hợp.Đây là mã:
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: Cần lưu ý rằng thứ tự của điều ORed với nhau trong regex vấn đề. Hãy xem xét bài kiểm tra sau đây lấy cảm hứng từ TZOTZIOY:
>>> 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
Điều này cho thấy thứ tự quan trọng: - /. Tôi không chắc điều này có nghĩa gì với ứng dụng của Rax, nhưng ít nhất là hành vi được biết đến.
UPDATE: tôi đăng this questions about the implementation of regular expressions in Python mà hy vọng sẽ cung cấp cho chúng tôi một số cái nhìn sâu sắc vào vấn đề tìm thấy với câu hỏi này.
Danh sách các bản chất có liên tục không? Tôi yêu cầu vì sử dụng các giải pháp loại Regex thường liên quan đến một số precomputations của biểu thức chính quy (rsp. Danh sách các chất nền trong trường hợp của bạn). Liệu rằng precomputation được khấu hao trên nhiều tìm kiếm? – Accipitridae