2010-06-14 10 views
37

Tengo una lista de expresiones regulares en python y una cadena. ¿Hay alguna manera elegante de verificar si la al menos una expresión regular en la lista coincide con la cadena? Por elegante, me refiero a algo mejor que simplemente recorrer todas las expresiones regulares y verificarlas contra la cuerda y detenerlas si se encuentra una coincidencia.Python: forma elegante de comprobar si al menos una expresión regular en la lista coincide con una cadena

Básicamente, tuve este código:

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

Ahora me gustaría tener algunas expresiones regulares en la lista, en lugar de sólo cuerdas, y me pregunto si hay una solución elegante para comprobar si hay una partido para reemplazar if string in list:.

Gracias de antemano.

+0

pitón no tiene nada que hace Emacs Lisp de expresión regular-opt https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp -Functions.html – ggg

+0

¿Por qué no te gustan los bucles? –

Respuesta

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

Si no necesitas saber cuál coincide, es mejor ponerlos entre corchetes con '(?: Regex)' en lugar de '(regex)' –

+2

Este método no funciona si hay más de 100 expresiones regulares en la matriz (Python 2.6). Pruebe la respuesta de nosklo a continuación. – 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

Si trabaja en Python 2.4, no tendrá 'any' - vea http://stackoverflow.com/questions/3785433/python-backports-for-some-methods –

+1

¿Cómo es esto *" algo mejor que simplemente pasar por un bucle? todas las expresiones regulares y verificarlas contra la cadena y detenerse si se encuentra una coincidencia "*? Supongo que la combinación de Ned y esta respuesta podría ser un ganador ... – johndodo

2

Una mezcla de ambos Ned y respuestas de Nosklo. Trabajos garantizados para cualquier longitud de la lista ... Esperamos que disfrute

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") 
Cuestiones relacionadas