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
- voir stackoverflow.com/questions/164414/…
- Là ' sa discussion similaire sur grep en python sur SO: stackoverflow.com/questions/1921894/grep-and-python , cette question version plus spécifique de cela
- \ w = nimporte quel mot char \ W = nimporte quel caractère autre quun mot
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 dea
àz
" mais vous ' ve implémentégrep '[^a-z]'
ce qui signifie que " inclut toute ligne contenant un caractère pas dans la plage dea
àz
. " Si une ligne contientabc123
alors votre requête limprimera par erreur car1
satisfait à ces critères.grep -v '[a-z]'
nimprimera pas cette ligne cara
satisfait aux critères annulés.