Qual è l'equivalente python di grep -v?


14

Mi piace grep -v. Io lo uso per tutto il tempo. Ma sto anche facendo un po 'di elaborazione del testo in Python e c'è una cosa cruciale che mi manca.

Di solito, uso grep -vper estrarre dal testo cose estranee.

Per esempio,

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

$ grep '[a-z]' > linesiwanted

Ma come posso abbinare il complemento di una regex in Python? Ad esempio, il complemento di \w?



C'è una discussione simile su grep in Python su SO: stackoverflow.com/questions/1921894/grep-and-python , questa domanda versione più specifica di quella
icc97,

\ w = qualsiasi parola char \ W = qualsiasi parola non word
Kasapo

Risposte:


17

Una regex in Python, i metodi searcho match, restituisce un Matchoggetto o None. Per grep -vequivalente, potresti usare:

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

O più concisamente:

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

+1 il link SO nel commento menziona affermazioni di aspetto negativo, ma a dire il vero penso che il tuo frammento sia molto più sensato ed elegante. Grazie.
ixtmixilix,

si scopre che puoi anche usare [^ az] per abbinare il complemento del set [az]
ixtmixilix

1

Si scopre che puoi semplicemente usare [^ az] per dire grep -v [a-z].

Lo sto usando come:

#!/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

Questi non sono gli stessi. grep -v '[a-z]'significa "escludi qualsiasi riga contenente un carattere nell'intervallo da aa z" ma hai implementato il grep '[^a-z]'che significa "includi qualsiasi riga contenente un carattere non compreso nell'intervallo da aa z". Se una riga ha la abc123tua query la stamperà erroneamente perché 1soddisfa tali criteri. grep -v '[a-z]'non stamperà questa riga perché asoddisfa i criteri negati.
Adam Katz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.