как сделать re.compile () со списком в Python - PullRequest
17 голосов
/ 19 июля 2011

У меня есть список строк, в которых я хочу фильтровать строки, содержащие ключевые слова.

Я хочу сделать что-то вроде:

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

, поэтому я могу использовать re.search (fruit, list_of_strings), чтобы получить только строки, содержащие фрукты, но я не уверен, как использовать список с re.compile. Какие-либо предложения? (Я не настроен на использование re.compile, но я думаю, что регулярные выражения были бы хорошим способом сделать это.)

Ответы [ 5 ]

41 голосов
/ 19 июля 2011

Вам нужно превратить ваш список фруктов в строку apple|banana|peach|plum|pineapple|kiwi, чтобы это было действительное регулярное выражение, следующее должно сделать это для вас:

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

edit : Как указал ridgerunner в комментариях, вы, вероятно, захотите добавить границы слов в регулярное выражение, в противном случае регулярное выражение будет совпадать с такими словами, как plump, так как они имеют в качестве подстроки фрукт.

fruit = re.compile(r'\b(?:%s)\b' % '|'.join(fruit_list))
6 голосов
/ 19 июля 2011

Как вы хотите точные совпадения, нет необходимости в 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!

РЕДАКТИРОВАТЬ: Если вам нужен доступ к соответствующим строкам:

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']
2 голосов
/ 19 июля 2011

Код:

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])

Пример использования:

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

Редактировать : Я понял, что решение Эндрю лучше. Вы могли бы улучшить fruit_test с помощью регулярного выражения Эндрю как

fruit_test = lambda x: andrew_re.search(x) is None
2 голосов
/ 19 июля 2011

Вы можете создать одно регулярное выражение, которое будет соответствовать при обнаружении любого из терминов:

>>> 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
0 голосов
/ 27 августа 2018

Обновление Pyhton 3.x:

fruit_list = ['apple', 'banana', 'peach', 'plum', 'pineapple', 'kiwi']
fruit = re.compile(r'\b(?:{0})\b'.format('|'.join(fruit_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...