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)]
?
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èrer
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é).Exemple de code Python 3 Exemple de code
Python 2.x
la source
<filter object at 0x1057acda0>
Qu'est-ce que je fais de mal?str
depuisfilter
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 acallable
comme premier argument, et retourne une liste où cet appelable a renvoyé une valeur «véridique».la source