J'ai une liste de chaînes dont je souhaite supprimer des éléments. J'ai une liste de mots-clés que je recherche dans ces éléments. Je n'arrive pas à obtenir le résultat que je recherche. Je ne sais pas si les expressions régulières sont la bonne façon de gérer cela.
Je veux que la sortie soit ['/ item / page / cat-dog', '/ item / page / animal-planet']
valid = ['/item/page/cat-dog', '/item/page/animal-planet', '/item/page/variable']
keywords = ['cat','planet']
for item in valid:
#a = re.findall()
#
3 Réponses :
Python est fourni avec les mots-clés pratiques dans et pas dans pour tester si un objet est ou non dans une liste.
pour votre problème, vous pouvez simplement faire:
new_list = []
for item in valid:
if os.path.basename(item) not in keywords:
new_list.append(item)
os.path.basename donne le nom des fichiers sans l'arborescence.
new_list contiendra alors tous les éléments de valid dans lesquels les noms de fichiers n'étaient pas dans keyword.
Autant que je sache, et basé sur @ dan-d's comment ce dont vous avez besoin est
[s for s in valid if not any(q in s for q in keywords)]
Comme suggéré dans les commentaires et autres réponses, le in peut être utilisé pour vérifier si une chaîne est une sous-chaîne d'une autre chaîne. Pour les données d'exemple de la question, utiliser dans est le moyen le plus simple et le plus rapide d'obtenir le résultat souhaité.
Si l'exigence est de correspondre à '/ item / page / cat-dog' mais pas '/ item / page / catapult' - qui ne correspond qu'au mot 'cat', pas seulement à la séquence cat , alors une expression régulière peut être utilisée pour faire la correspondance .
Le modèle correspondant à un seul mot est '\ bfoo \ b' où '\ b' marque une limite de mot.
L'opérateur d'alternance '|' est utilisé pour faire correspondre un modèle ou un autre, par exemple 'foo | bar' correspond à 'foo' ou em > 'bar'.
Construisez un modèle qui correspond aux mots dans mots-clés ; appelez re.escape sur chaque mot-clé au cas où ils contiennent des caractères que le moteur regex pourrait interpréter comme des métacaractères.
>>> matches = [word for word in valid if rx.search(word)] >>> matches ['/item/page/cat-dog', '/item/page/animal-planet']
Compilez le modèle dans un objet expression régulière .
>>> matches = list(filter(rx.search, valid)) >>> matches ['/item/page/cat-dog', '/item/page/animal-planet']
Trouvez les correspondances: en utilisant filter est élégant:
>>> rx = re.compile(pattern)
Mais c'est courant d'utiliser une compréhension de liste :
XXX
Je ne sais pas ce que vous voulez que ce code fasse
[s pour s en valide le cas échéant (q en s pour q en mots-clés)]?Copie possible de Comment faire une liste à plat de liste de listes