Quel est l'équivalent python de grep -v?


14

J'aime grep -v. Je l'utilise tout le temps. Mais je fais aussi du traitement de texte en python, et il me manque une chose cruciale.

Habituellement, j'utilise grep -vpour retirer des éléments étrangers du 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 puis-je faire correspondre le complément d'une expression régulière en Python? Par exemple, le complément de \w?



Il y a une discussion similaire sur grep en python sur SO: stackoverflow.com/questions/1921894/grep-and-python , cette question une version plus spécifique de cela
icc97

\ w = n'importe quel caractère \ W = tout autre caractère
Kasapo

Réponses:


17

Une expression régulière en Python, les méthodes searchou match, renvoie un Matchobjet ou None. Pour l' grep -véquivalent, vous pouvez utiliser:

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

Ou plus précisément:

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

+1 le lien SO dans le commentaire mentionne des assertions de recherche négative, mais pour être honnête, je pense que votre extrait est beaucoup plus sensible et élégant. Merci.
ixtmixilix

il s'avère que vous pouvez également utiliser [^ az] pour faire correspondre le complément de l'ensemble [az]
ixtmixilix

1

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

Je l'utilise 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

Ce ne sont pas les mêmes. grep -v '[a-z]'signifie "exclure toute ligne contenant un caractère dans la plage de aà z" mais vous avez implémenté grep '[^a-z]'ce qui signifie "inclure toute ligne contenant un caractère ne se trouvant pas dans la plage de aà z". Si une ligne contient, abc123votre requête l'imprimera par erreur car elle 1répond à ces critères. grep -v '[a-z]'n'imprimera pas cette ligne car arépond aux critères négatifs.
Adam Katz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.