Quero filtrar strings em uma lista com base em uma expressão regular.
Existe algo melhor do que [x for x in list if r.match(x)]?
Respostas:
Você pode criar um iterador no Python 3.x ou uma lista no Python 2.x usando:
filter(r.match, list)
Para converter o iterador Python 3.x em uma lista, basta lançá-lo; list(filter(..)).
filterversão é perfeitamente clara e tem muito menos ruído.
r.matchaqui?
r.matché um método que, quando aplicado a uma determinada string, descobre se a regex rcorresponde àquela string (e retorna um objeto de correspondência correspondente se for o caso, mas isso não importa neste caso, pois apenas nos importamos se o resultado é verdadeiro)
Exemplo completo (Python 3):
para Python 2.x, observe a nota abaixo
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Impressões:
['cat', 'wildcat', 'thundercat']
Nota:
Para desenvolvedores Python 2.x, filterjá retorna uma lista. No Python 3.xfilter foi alterado para retornar um iterador, então ele deve ser convertido para list(a fim de vê-lo bem impresso).
<filter object at 0x1057acda0>O que estou fazendo de errado?
strpois filterretorna uma lista de qualquer maneira, sem sucesso ...
print(list(newlist))ouprint([i for i in newlist])
Para fazer isso sem compilar o Regex primeiro, use uma lambdafunção - por exemplo:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Retorna:
['123', '234']
filter()apenas pega a callablecomo primeiro argumento e retorna uma lista em que aquele chamável retornou um valor 'verdadeiro'.