cómo hacer re.compile () con una lista en python

Tengo una lista de cadenas en las que quiero filtrar las cadenas que contienen palabras clave.

Quiero hacer algo como:

fruit = re.compile('apple', 'banana', 'peach', 'plum', 'pinepple', 'kiwi'] 

entonces puedo usar re.search (fruit, list_of_strings) para obtener solo las cadenas que contienen frutas, pero no estoy seguro de cómo usar una lista con re.compile. ¿Alguna sugerencia? (No estoy configurado para usar re.compile, pero creo que las expresiones regulares serían una buena manera de hacer esto).

Debe convertir su lista de frutas en la cadena apple|banana|peach|plum|pineapple|kiwi para que sea una expresión regular válida, lo siguiente debe hacer esto por usted:

 fruit_list = ['apple', 'banana', 'peach', 'plum', 'pineapple', 'kiwi'] fruit = re.compile('|'.join(fruit_list)) 

Edición : como lo señaló Ridgerunner en los comentarios, es probable que desee agregar límites de palabras a la expresión regular, de lo contrario, la expresión regular coincidirá con palabras como plump ya que tienen una fruta como subcadena.

 fruit = re.compile(r'\b(?:%s)\b' % '|'.join(fruit_list)) 

Como usted quiere coincidencias exactas , no hay necesidad real de regex imo …

 fruits = ['apple', 'cherry'] sentences = ['green apple', 'yellow car', 'red cherry'] for s in sentences: if any(f in s for f in fruits): print s, 'contains a fruit!' # green apple contains a fruit! # red cherry contains a fruit! 

EDITAR: Si necesita acceder a las cadenas que coinciden:

 from itertools import compress fruits = ['apple', 'banana', 'cherry'] s = 'green apple and red cherry' list(compress(fruits, (f in s for f in fruits))) # ['apple', 'cherry'] 

Puede crear una expresión regular, que coincidirá, cuando se encuentre cualquiera de los términos:

 >>> s, t = "A kiwi, please.", "Strawberry anyone?" >>> import re >>> pattern = re.compile('apple|banana|peach|plum|pineapple|kiwi', re.IGNORECASE) >>> pattern.search(s) <_sre.SRE_Match object at 0x10046d4a8> >>> pattern.search(t) # won't find anything 

Código:

 fruits = ['apple', 'banana', 'peach', 'plum', 'pinepple', 'kiwi'] fruit_re = [re.compile(fruit) for fruit in fruits] fruit_test = lambda x: any([pattern.search(x) for pattern in fruit_re]) 

Ejemplo de uso:

 fruits_veggies = ['this is an apple', 'this is a tomato'] return [fruit_test(str) for str in fruits_veggies] 

Edit : Me di cuenta de que la solución de Andrew es mejor. Podrías mejorar fruit_test con la expresión regular de Andrew como

 fruit_test = lambda x: andrew_re.search(x) is None 

Actualización de Pyhton 3.x:

 fruit_list = ['apple', 'banana', 'peach', 'plum', 'pineapple', 'kiwi'] fruit = re.compile(r'\b(?:{0})\b'.format('|'.join(fruit_list))