Jaký je pythonový ekvivalent grep -v?

Líbí se mi grep -v. Používám to pořád. Ale také dělám nějaké zpracování textu v pythonu a je tu jedna zásadní věc, která mi chybí.

Obvykle používám grep -v k odstranění cizích věcí text.

Například

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

Jak ale porovnám doplněk regexu v Pythonu? Například doplněk \w?

Komentáře

odpověď

regex v Pythonu vrátí metoda search nebo match objekt Match nebo None. Pro ekvivalent grep -v můžete použít:

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

Nebo ještě stručněji:

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

Komentáře

  • +1 odkaz SO v komentáři zmiňuje tvrzení negativního vzhledu, ale abych byl upřímný, myslím, že váš úryvek je mnohem rozumnější a elegantnější. děkuji.
  • ukázalo se, že můžete také použít [^ az] k doplnění množiny sady [az]

odpověď

Ukázalo se, že stačí použít [^ az] ve smyslu grep -v [a-z].

Používám to jako :

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

Komentáře

  • Nejsou to stejné. grep -v '[a-z]' znamená " vyloučit jakýkoli řádek obsahující znak v rozsahu od a do z " ale vy ' jsem implementován grep '[^a-z]' což znamená " zahrnout jakýkoli řádek obsahující znak ne v rozsahu od az. " Pokud má řádek abc123 poté jej váš dotaz omylem vytiskne, protože 1 tato kritéria splňuje. grep -v '[a-z]' tento řádek nevytiskne, protože a splňuje negovaná kritéria.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *