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 daaaz" ma tu ' ho implementatogrep '[^a-z]'che significa che " include qualsiasi riga contenente un carattere non nellintervallo daaaz. " Se una riga haabc123, la tua query la stamperà erroneamente perché1soddisfa tali criteri.grep -v '[a-z]'non stamperà questa riga perchéasoddisfa i criteri negati.