Qual è lequivalente in Python di grep -v?

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

Di solito, utilizzo grep -v per estrarre cose estranee da testo.

Ad 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 faccio ad abbinare il complemento di una regex in Python? Ad esempio, il complemento di \w?

Commenti

Answer

Una regex in Python, il metodo search o match restituisce un oggetto Match o None. Per lequivalente grep -v, potresti utilizzare:

 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])  

Commenti

  • +1 il link SO nel commento menziona le affermazioni negative-lookahead ma ad essere onesto penso che il tuo snippet sia molto più sensato ed elegante. grazie.
  • Si scopre che puoi anche usare [^ az] per abbinare il complemento dellinsieme [az]

Risposta

Si scopre che puoi semplicemente usare [^ az] per indicare 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  

Commenti

  • Non sono la stessa cosa. grep -v '[a-z]' significa che " esclude qualsiasi riga contenente un carattere nellintervallo da a a z " ma tu ' ho implementato grep '[^a-z]' che significa che " include qualsiasi riga contenente un carattere non nellintervallo da a a z. " Se una riga ha abc123, la tua query la stamperà erroneamente perché 1 soddisfa tali criteri. grep -v '[a-z]' non stamperà questa riga perché a soddisfa i criteri negati.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *