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(..)).
filterversion est parfaitement claire et a beaucoup moins de bruit.
r.matcht-il ici?
r.matchest une méthode qui, lorsqu'elle est appliquée à une chaîne donnée, trouve si l'expression régulière rcorrespond à 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, filterrenvoie 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?
strdepuis filterrenvoie 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 lambdafonction - 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 callablecomme premier argument, et retourne une liste où cet appelable a renvoyé une valeur «véridique».