2012-01-17 19 views
7

¿Hay alguna manera de ver si una línea contiene palabras que coinciden con un conjunto de patrones de expresiones regulares? Si tengo [regex1, regex2, regex3], y quiero ver si una línea coincide con cualquiera de ellas, ¿cómo podría hacerlo? En este momento, estoy usando re.findall(regex1, line), pero solo coincide con 1 expresión regular a la vez.Coincide con una línea con varias expresiones regulares usando Python

Respuesta

20

Puede usar las funciones integradas any (o all si todas las expresiones regulares tienen que coincidir) y una expresión de generador para hacer un ciclo a través de todos los objetos regex.

any (regex.match(line) for regex in [regex1, regex2, regex3])

(o any(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2]) si las expresiones regulares no son pre-compilados objetos de expresiones regulares, por supuesto)

A pesar de que habrá ineficient en comparación con la combinación de sus expresiones regulares en una sola expresión - si este código es el momento o cpu critical, debería intentar en su lugar, componer una única expresión regular que abarque todas sus necesidades, utilizando el operador especial de expresiones regulares | para separar las expresiones originales. Una forma sencilla de combinar todos los regexs es el uso de la cadena "unirse" operador:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

Aunque la combinación de las expresiones regulares en este formulario puede dar lugar a expresiones erróneas si los originales ya hacen uso de la | operador.

+2

Puede hacer que el método de unión tenga menos probabilidades de fallar si ajusta cada expresión entre paréntesis. ''(' + ') | ('. join (['foo', 'bar', 'baz']) + ')'' da ''(foo) | (barra) | (baz)''. – FakeRainBrigand

+3

Mejor aún, ajuste '(?: ...)', y junte la cadena de una manera que resalte su estructura lógica. ''|' join ('(?: {0})'. format (x) para x in ('foo', 'bar', 'baz'))' por ejemplo. –

+0

Funcionó para mí .... Gracias – Prateek

1

Pruebe esta nueva expresión regular: (regex1) | (regex2) | (regex3). Esto coincidirá con una línea con cualquiera de las 3 expresiones regulares en ella.

+1

'(?: ...)' es probablemente una mejor idea que '(...)' aquí, para evitar la creación de grupos de captura falsos. –

+1

@Karl ... a menos que desee verificar la veracidad de '.group (n)' para determinar * qué * grupo capturó. –

1

Puede recorrer los elementos de expresiones regulares y hacer una búsqueda.

regexList = [regex1, regex2, regex3] 

line = 'line of data' 
gotMatch = False 
for regex in regexList: 
    s = re.search(regex,line) 
    if s: 
     gotMatch = True 
     break 

if gotMatch: 
    doSomething() 
Cuestiones relacionadas