Я хочу фильтровать строки в списке на основе регулярного выражения.
Есть что-нибудь лучше [x for x in list if r.match(x)]
?
Вы можете создать итератор в Python 3.x или список в Python 2.x, используя:
filter(r.match, list)
Чтобы преобразовать итератор Python 3.x в список, просто приведите его; list(filter(..))
.
filter
версия совершенно четкая и имеет гораздо меньше шума.r.match
здесь?r.match
- это метод, который при применении к заданной строке определяет, соответствует ли регулярное выражениеr
этой строке (и возвращает соответствующий объект соответствия, если это так, но в данном случае это не имеет значения, поскольку нам просто важно, является ли результат правдивым)Полный пример (Python 3):
для Python 2.x см. Примечание ниже
import re mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"] r = re.compile(".*cat") newlist = list(filter(r.match, mylist)) # Read Note print(newlist)
Печать:
['cat', 'wildcat', 'thundercat']
Заметка:
Для разработчиков Python 2.x уже
filter
возвращает список. В Python 3.xfilter
было изменено возвращать итератор, поэтому его нужно преобразовать вlist
(чтобы он хорошо распечатался).Пример кода Python 3 Пример кода
Python 2.x
источник
<filter object at 0x1057acda0>
Что я делаю не так?»str
посколькуfilter
возвращает список, но безрезультатно ...print(list(newlist))
илиprint([i for i in newlist])
Чтобы сделать это без предварительной компиляции Regex, используйте
lambda
функцию, например:from re import match values = ['123', '234', 'foobar'] filtered_values = list(filter(lambda v: match('^\d+$', v), values)) print(filtered_values)
Возврат:
['123', '234']
filter()
просто принимает вcallable
качестве первого аргумента и возвращает список, в котором этот вызываемый объект вернул истинное значение.источник