2012-07-07 4 views
0

Est-il possible de supprimer tous les éléments d'une liste qui ne contiennent pas de chaîne d'expression régulière? Je pensais peut-être renvoyer seulement une chaîne d'expression régulière, et s'il n'y en avait pas, rendre l'élément de liste vide, puis réitérer la liste une deuxième fois pour supprimer toutes les entrées vides, mais cela semble inefficace .Supprimer tous les éléments d'une liste qui ne contiennent pas de chaîne d'expression régulière

Des pensées?

Par exemple, permet de dire que j'ai:

["cat", "dog", "monkey", "Fred", "sad"] 

et j'écris une expression régulière qui sélectionne seulement pour triste. Je veux que tous les autres soient supprimés (de préférence).

+0

Vous devez réécrire votre question pour être plus clea r sur ce que vous voulez. Cherchez-vous un match one-to-one entre les regex et les chaînes? Ou essayez-vous de tester chaque chaîne avec chaque regex (produit cartésien)? –

+0

Ok, donc j'ai une liste de mots. Je veux parcourir cette liste et la comparer à une autre liste de phrases, et vérifier quand l'un des mots de la première liste est dans la seconde et enregistrer le nombre d'occurrences par mot. –

Répondre

8

La meilleure façon de le faire est de construire une nouvelle liste à l'aide d'une compréhension de la liste:

regex = re.compile(...) 
new_list = [s for s in old_list if regex.match(s)] 

ou, en utilisant filter():

new_list = filter(regex.match, old_list) 
+0

Voici le code: wordlist = ['triste', 'fou', 'im', 'chats', 'chiens', 'chèvres'] new_list = [s pour tweets si re.match (liste de mots)] imprimer new_list –

+0

Obtenir "match() prend au moins 2 arguments" –

+0

Oh, attends, regarde dans .compile - tu ne peux pas compiler une liste. –

2
import re 
filters  = ['^sad', '^.*ed$'] 
expressions = [re.compile(x) for x in filters] 
words   = ['cat', 'dog', 'monkey', 'fred', 'sad', 'saddening'] 
filtered_list = [s for s in words if any(re.match(s) for re in expressions)] 

Sortie:

['fred', 'sad', 'saddening'] 
Questions connexes