Я хочу фильтровать строки в списке на основе регулярного выражения.
Есть что-нибудь лучше [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(чтобы он хорошо распечатался).
<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качестве первого аргумента и возвращает список, в котором этот вызываемый объект вернул истинное значение.