2010-06-14 15 views
37

Python'da bir regex listesi ve bir dize var. Listedeki en az bir regexin dizeyle eşleşip eşleşmediğini kontrol etmenin zarif bir yolu var mı? Zarif olarak, tüm normal ifadeler arasında döngü yapmaktan ve bunları dizgeye karşı kontrol etmekten ve bir eşleşme bulunursa durmaktan daha iyi bir şey demek istiyorum.Python: Listedeki en az bir normal ifadenin bir dizeyle eşleşip eşleşmediğini kontrol etmenin zarif yolu

Temelde, bu kodu vardı:

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

Şimdi ben yerine sadece dizeleri daha listede bazı normal ifadeler istiyorum ve denetlemek için zarif bir çözüm olup olmadığını merak ediyorum if string in list:'u değiştirmek için eşleştirin.

Şimdiden teşekkürler.

+0

piton yapar ilgisi beğeneceğinizi umuyoruz emacs lisp en regexp'in-opt https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp -Functions.html – ggg

+0

Neden döngülerden hoşlanmıyorsunuz? –

cevap

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

Hangisinin eşleştiğini bilmeniz gerekmiyorsa, bunları ((regex) 'yerine' (?: regex) 'ile birleştirmek daha iyidir. –

+2

Dizide 100'den fazla regex varsa, bu yöntem çalışmaz (Python 2.6). Nosklo'nun cevabını aşağıda deneyin. – 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

Eğer python 2.4'te çalışıyorsanız, herhangi bir '' '- '' olmayacaksınız - bkz http://stackoverflow.com/questions/3785433/python-backports-for-some-methods –

+1

Bu nasıl olur? tüm regexler ve onları bir dize ile karşılaştırarak bir eşleşme "*? Ned'in kombinasyonu ve bu cevabın bir galibi olabilir ... – johndodo

2

hem Ned ve Nosklo yanıtlarının karışımı. Listenin herhangi bir uzunluk için garantili İşleri ... Eğer

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") 
İlgili konular