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.