Quel est léquivalent python de grep -v?

Jaime grep -v. Je lutilise tout le temps. Mais je fais aussi du traitement de texte en python, et il me manque une chose cruciale.

Habituellement, jutilise grep -v pour supprimer les éléments superflus. texte.

Par exemple,

$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted 

Mais comment faire correspondre le complément dune regex en Python? Par exemple, le complément de \w?

Commentaires

Réponse

Une expression régulière en Python, la méthode search ou match renvoie un objet Match ou None. Pour léquivalent grep -v, vous pouvez utiliser:

 import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)  

Ou de manière plus concise:

 import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])  

Commentaires

  • +1 le lien SO dans le commentaire mentionne des assertions à anticipation négative, mais pour être honnête, je pense que votre extrait de code est beaucoup plus sensé et élégant. merci.
  • il savère que vous pouvez également utiliser [^ az] pour faire correspondre le complément de lensemble [az]

Réponse

Il savère que vous pouvez simplement utiliser [^ az] pour signifier grep -v [a-z].

Je lutilise comme :

 #!/usr/bin/env python # coding=UTF-8 import sys, re for file in sys.argv[1:]: f = open(file) string = f.read() regex = re.compile("[^a-z]") subs = regex.sub("", string) f.close() print subs  

Commentaires

  • Ce ne sont pas les mêmes. grep -v '[a-z]' signifie " exclure toute ligne contenant un caractère de la plage de a à z " mais vous ' ve implémenté grep '[^a-z]' ce qui signifie que " inclut toute ligne contenant un caractère pas dans la plage de a à z. " Si une ligne contient abc123 alors votre requête limprimera par erreur car 1 satisfait à ces critères. grep -v '[a-z]' nimprimera pas cette ligne car a satisfait aux critères annulés.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *