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
- vedi stackoverflow.com/questions/164414/…
- Cè ' sa discussione simile su grep in python su SO: stackoverflow.com/questions/1921894/grep-and-python , questa domanda versione più specifica
- \ w = any word char \ W = any non-word char
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 daa
az
" ma tu ' ho implementatogrep '[^a-z]'
che significa che " include qualsiasi riga contenente un carattere non nellintervallo daa
az
. " Se una riga haabc123
, 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.