Care este echivalentul python al grep -v?

Îmi place grep -v. Îl folosesc tot timpul. Dar fac și unele procesări de text în python și există un lucru crucial care îmi lipsește.

De obicei, folosesc grep -v pentru a scoate lucruri străine din text.

De exemplu,

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

Dar cum pot potrivi complementul unei regexuri în Python? De exemplu, complementul \w?

Comentarii

Răspuns

O regex în Python, fie search, fie match, returnează un obiect Match sau None. Pentru echivalentul grep -v, puteți utiliza:

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

Sau mai concis:

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

Comentarii

  • +1 link-ul SO din comentariu menționează afirmații negative, dar, sincer, cred că fragmentul dvs. este mult mai sensibil și elegant. mulțumesc.
  • se pare că poți folosi și [^ az] pentru a se potrivi cu complementul setului [az]

Răspunde

Se pare că puteți folosi [^ az] pentru a însemna grep -v [a-z].

Îl folosesc ca :

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

Comentarii

  • Acestea nu sunt aceleași. grep -v '[a-z]' înseamnă " excludeți orice linie care conține un caracter în interval de la a la z " dar tu ' am implementat grep '[^a-z]' ceea ce înseamnă că " include orice linie care conține un caracter not în intervalul de la a la z. " Dacă o linie are abc123 atunci interogarea dvs. o va imprima eronat deoarece 1 îndeplinește acel criteriu. grep -v '[a-z]' nu va imprima această linie deoarece a îndeplinește criteriile anulate.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *