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)]
?
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(..))
.
filter
versão é perfeitamente clara e tem muito menos ruído.r.match
aqui?r.match
é um método que, quando aplicado a uma determinada string, descobre se a regexr
corresponde à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,
filter
já retorna uma lista. No Python 3.xfilter
foi alterado para retornar um iterador, então ele deve ser convertido paralist
(a fim de vê-lo bem impresso).Exemplo de código Python 3 Exemplo de código
Python 2.x
fonte
<filter object at 0x1057acda0>
O que estou fazendo de errado?str
poisfilter
retorna 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
lambda
funçã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 acallable
como primeiro argumento e retorna uma lista em que aquele chamável retornou um valor 'verdadeiro'.fonte