2010-06-14 15 views
37

Ho una lista di regex in python e una stringa. C'è un modo elegante per verificare se almeno una espressione regolare nella lista corrisponde alla stringa? Con eleganza, intendo qualcosa di meglio del semplice ciclo di tutte le regex e il loro controllo sulla stringa e l'arresto se viene trovata una corrispondenza.Python: modo elegante per verificare se almeno una espressione regolare nell'elenco corrisponde a una stringa

Fondamentalmente, ho avuto questo codice:

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

Ora vorrei avere alcune espressioni regolari nella lista, e non solo stringhe, e mi chiedo se non v'è una soluzione elegante per verificare la presenza di un abbinare per sostituire if string in list:.

Grazie in anticipo.

+0

python non ha nulla che fa Emacs Lisp di regexp-opt https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp -Functions.html – ggg

+0

Perché non ti piacciono i loop? –

risposta

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

Se non hai bisogno di sapere quale corrisponda, è meglio metterli tra parentesi con '(?: Regex)' invece di '(regex)' –

+2

Questo metodo non funziona se ci sono più di 100 regex nell'array (Python 2.6). Prova la risposta di nosklo qui sotto. – 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

Se si lavora in python 2.4, non si avrà 'any' - vedere http://stackoverflow.com/questions/3785433/python-backports-for-some-methods –

+1

In che modo *" qualcosa di meglio del semplice looping tutte le regex e controllarle contro la stringa e fermarsi se viene trovata una corrispondenza "*? Immagino che la combinazione tra Ned e questa risposta potrebbe essere vincente anche se ... – johndodo

2

Un mix di Ned e risposte di Nosklo. Opere garantiti per un certo periodo di lista ... Spero che ti piace

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") 
Problemi correlati