Je souhaite filtrer les chaînes dans une liste basée sur une expression régulière.
Y a-t-il quelque chose de mieux que [x for x in list if r.match(x)]
?
Réponses:
Vous pouvez créer un itérateur en Python 3.x ou une liste en Python 2.x en utilisant:
filter(r.match, list)
Pour convertir l' itérateur Python 3.x en liste, il suffit de le convertir ; list(filter(..))
.
filter
version est parfaitement claire et a beaucoup moins de bruit.
r.match
t-il ici?
r.match
est une méthode qui, lorsqu'elle est appliquée à une chaîne donnée, trouve si l'expression régulière r
correspond à cette chaîne (et renvoie un objet de correspondance correspondant si c'est le cas, mais cela n'a pas d'importance dans ce cas car nous nous soucions simplement de savoir si le résultat est véridique)
Exemple complet (Python 3):
Pour Python 2.x, regardez la note ci-dessous
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Impressions:
['cat', 'wildcat', 'thundercat']
Remarque:
Pour les développeurs Python 2.x, filter
renvoie déjà une liste. En Python 3.x afilter
été modifié pour renvoyer un itérateur, il doit donc être converti enlist
(afin de le voir bien imprimé).
<filter object at 0x1057acda0>
Qu'est-ce que je fais de mal?
str
depuis filter
renvoie une liste de toute façon, en vain ...
print(list(newlist))
ouprint([i for i in newlist])
Pour ce faire sans compiler le Regex au préalable, utilisez une lambda
fonction - par exemple:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Retour:
['123', '234']
filter()
prend juste a callable
comme premier argument, et retourne une liste où cet appelable a renvoyé une valeur «véridique».