Î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
- vezi stackoverflow.com/questions/164414/…
- Acolo ' discuție similară despre grep în python pe SO: stackoverflow.com/questions/1921894/grep-and-python , această întrebare versiune mai specifică a acelei
- \ w = orice caracter de cuvânt \ W = orice caracter care nu conține cuvânt
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 laa
laz
" dar tu ' am implementatgrep '[^a-z]'
ceea ce înseamnă că " include orice linie care conține un caracter not în intervalul de laa
laz
. " Dacă o linie areabc123
atunci interogarea dvs. o va imprima eronat deoarece1
îndeplinește acel criteriu.grep -v '[a-z]'
nu va imprima această linie deoarecea
îndeplinește criteriile anulate.