2017-10-19 11 views
0

J'ai une liste de listes contenant des lexiques. Je veux supprimer des listes de la liste si elles ont des lexiques qui ne contiennent pas un motif de caractères tel que "(atè | atwa | atif) $". Par exemple:Comment supprimer une ligne d'une liste de listes si l'un des mots ne contient pas certains caractères en Python?

list = [['blablatè', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 

Le résultat attendu serait:

[['blablatè', 'blabla'], ['matwa', 'mat'], ['ratif']] 

Je pensais que je pouvais le faire avec une boucle et re.search(), mais il ne fonctionne pas. Voici mon code:

import re 
result = [['blablatè', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
rendp = "(atè|atwa|atif)$" 
for row in result : 
    if re.search(rendp, row) == None : 
     result.remove(row) 
joined = '\n'.join(' - '.join(map(str, row)) for row in result) 
print(joined) 

est ici l'erreur:

Traceback (most recent call last): 
    File "C:\Users\alice\OneDrive\Documents\Visual Studio 2017\Projects\CréoleDB\CréoleDB\CréoleDB.py", line 65, in <module> 
    if re.search(rendp, row) == None : 
    File "C:\Users\alice\Anaconda3\lib\re.py", line 182, in search 
    return _compile(pattern, flags).search(string) 
TypeError: expected string or bytes-like object 

Je pourrais vraiment utiliser un peu d'aide. Merci beaucoup !

+0

L'erreur que vous voyez est parce que vous essayez de rechercher le modèle dans la liste intérieure. re.search ne fonctionne que lorsque vous recherchez un motif dans une chaîne. – suripoori

Répondre

1

Avec re.compile(), regex.search() et any() fonctions:

import re 

lists = [['blablaté', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
pat = re.compile(r'(até|atwa|atif)$') # compiled regular expression object 
result = [l for l in lists if any(pat.search(i) for i in l)] 

print(result) 

La sortie:

[['blablaté', 'blabla'], ['matwa', 'mat'], ['ratif']] 

P.S. S'il vous plaît ne donnez pas vos noms de variables comme list, dict, str etc., que sont intégrés dans les types de données Python

+0

@AlicePhoenix, vous êtes les bienvenus – RomanPerekhrest

+0

woops, mon commentaire n'a pas été posté ... Merci beaucoup, ça fonctionne parfaitement :) –

1

Actuellement, vous passez une liste (row) à re.search; cependant, seule une chaîne peut être utilisée pour la correspondance de modèle. Essayez de filtrer la liste en utilisant une compréhension:

import re 
result = [['blablaté', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
rendp = "(até|atwa|atif)$" 
final_list = [i for i in result if any(re.findall(rendp, b) for b in i)] 

Sortie:

[['blablaté', 'blabla'], ['matwa', 'mat'], ['ratif']] 
1

L'erreur que vous voyez est parce que vous essayez de rechercher le modèle dans la liste intérieure. re.search ne fonctionne que lorsque vous recherchez un motif dans une chaîne. Vous pouvez essayer d'avoir une boucle imbriquée comme ceci:

for word_list in result: 
    for word in word_list: 
     if re.search(rendp, word) == None: 
      word_list.remove(word) 
+0

Merci pour l'explication! J'essaie d'éviter d'utiliser des boucles imbriquées car mon script prend déjà 20 minutes à s'exécuter car il fonctionne sur une base de données, mais je vais essayer cela sur une simple liste de listes. –