2010-06-14 29 views
37

Tôi có danh sách các regex trong python và một chuỗi. Có cách nào thanh lịch để kiểm tra xem có ít nhất một regex trong danh sách khớp với chuỗi không? Bởi thanh lịch, tôi có nghĩa là một cái gì đó tốt hơn so với chỉ đơn giản là lặp qua tất cả các regexes và kiểm tra chúng chống lại chuỗi và dừng lại nếu một trận đấu được tìm thấy.Python: Cách thanh lịch để kiểm tra xem có ít nhất một regex trong danh sách khớp với một chuỗi

Về cơ bản, tôi đã có mã này:

list = ['something','another','thing','hello'] 
string = 'hi' 
if string in list: 
    pass # do something 
else: 
    pass # do something else 

Bây giờ tôi muốn có một số biểu thức thông thường trong danh sách, chứ không phải chỉ là chuỗi, và tôi tự hỏi nếu có một giải pháp thanh lịch để kiểm tra một phù hợp để thay thế if string in list:.

Xin cảm ơn trước.

+0

trăn không có gì mà không emacs lisp của regexp-opt https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp -Functions.html – ggg

+0

Tại sao bạn không thích vòng lặp? –

Trả lời

65
import re 

regexes = [ 
    "foo.*", 
    "bar.*", 
    "qu*x" 
    ] 

# Make a regex that matches if any of our regexes match. 
combined = "(" + ")|(".join(regexes) + ")" 

if re.match(combined, mystring): 
    print "Some regex matched!" 
+3

Nếu bạn không cần phải biết cái nào phù hợp, tốt hơn là đặt chúng với '(?: Regex)' thay vì '(regex)' –

+2

Phương pháp này không hoạt động nếu có hơn 100 regex trong mảng (Python 2.6). Hãy thử câu trả lời của nosklo dưới đây. – Amjith

+3

'regexes = '(?:% S)'% '|' .join (regexes)' – alxndr

72
import re 

regexes = [ 
    # your regexes here 
    re.compile('hi'), 
# re.compile(...), 
# re.compile(...), 
# re.compile(...), 
] 

mystring = 'hi' 

if any(regex.match(mystring) for regex in regexes): 
    print 'Some regex matched!' 
+0

Nếu làm việc trong python 2.4, bạn sẽ không có 'any' - xem http://stackoverflow.com/questions/3785433/python-backports-for-some-methods –

+1

Làm thế nào là điều này *" một cái gì đó tốt hơn so với chỉ đơn giản là lặp qua tất cả các regexes và kiểm tra chúng chống lại chuỗi và dừng lại nếu một trận đấu được tìm thấy "*? Tôi đoán sự kết hợp của Ned và câu trả lời này có thể là một người chiến thắng mặc dù ... – johndodo

2

Một hỗn hợp các câu trả lời Nosklo của cả Ned và. Công trình được bảo đảm đối với bất kỳ chiều dài của danh sách ... hy vọng bạn thưởng thức

import re 
raw_lst = ["foo.*", 
      "bar.*", 
      "(Spam.{0,3}){1,3}"] 

reg_lst = [] 
for raw_regex in raw_lst: 
    reg_lst.append(re.compile(raw_regex)) 

mystring = "Spam, Spam, Spam!" 
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst): 
    print("something matched") 
Các vấn đề liên quan