107 votes

Expressions régulières : Recherche dans une liste

Je veux filtrer les chaînes de caractères d'une liste en fonction d'une expression régulière.

Y a-t-il quelque chose de mieux que [x for x in list if r.match(x)] ?

232voto

Mercury Points 2608

Exemple complet (Python 3) :
Pour Python 2.x, consultez la note suivante

import re

mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note below
print(newlist)

Imprimés :

['cat', 'wildcat', 'thundercat']

Nota:

Pour les développeurs Python 2.x, filter renvoie déjà une liste. Dans Python 3.x filter a été modifié pour retourner un itérateur, il doit donc être converti en list (afin de le voir imprimé joliment).

Exemple de code Python 3
Exemple de code Python 2.x

131voto

sepp2k Points 157757

Vous pouvez créer un itérateur dans Python 3.x ou un liste dans Python 2.x en utilisant :

filter(r.match, list)

Pour convertir la version Python 3.x itérateur à une liste, il suffit de la couler ; list(filter(..)) .

2 votes

En fait, les compréhensions de listes sont généralement préférées aux constructions fonctionnelles telles que filter, reduce, lambda, etc.

41 votes

@Ivo : Ils sont généralement préférés car ils sont généralement plus clairs et souvent plus succincts. Cependant, dans ce cas, le filter est parfaitement claire et présente beaucoup moins de bruit.

10 votes

Ce qui est r.match ici ?

5voto

Collin Heist Points 1032

Pour ce faire, sans compiler la Regex au préalable, utilisez un fichier de type lambda par exemple :

from re import match

values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))

print(filtered_values)

Les retours :

['123', '234']

filter() prend juste un callable comme premier argument, et renvoie une liste où cet appelant a retourné une valeur "vraie".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X