Jeg kan godt lide grep -v
. Jeg bruger det hele tiden. Men jeg laver også tekstbehandling i python, og der er en vigtig ting, som jeg mangler.
Normalt bruger jeg grep -v
til at tage fremmede ting ud af tekst.
For eksempel
$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted
Men hvordan matcher jeg komplementet til en regex i Python? For eksempel komplementet af \w
?
Kommentarer
- se stackoverflow.com/questions/164414/…
- Der ' sa lignende diskussion om grep i python på SO: stackoverflow.com/questions/1921894/grep-and-python , dette spørgsmål mere specifik version af det
- \ w = ethvert ord char \ W = ethvert ikke-char char
Svar
En regex I Python returnerer enten search
eller match
-metoderne et Match
-objekt eller None
. For grep -v
ækvivalent kan du bruge:
import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)
Eller mere kortfattet:
import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])
Kommentarer
- +1 SO-linket i kommentaren nævner påstande om negativ udseende, men for at være ærlig synes jeg dit uddrag er meget mere fornuftigt og elegant. tak.
- det viser sig, at du også kan bruge [^ az] til at matche komplementet til sættet [az]
Svar
Det viser sig, at du bare kan bruge [^ az] til at betyde grep -v [a-z]
.
Jeg bruger det som :
#!/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
Kommentarer
- Disse er ikke de samme.
grep -v '[a-z]'
betyder " ekskluderer enhver linje, der indeholder et tegn i området fraa
tilz
" men du ' har implementeretgrep '[^a-z]'
hvilket betyder " inkluderer enhver linje, der indeholder et tegn ikke i området fraa
tilz
. " Hvis en linje harabc123
så vil din forespørgsel fejlagtigt udskrive den, fordi1
opfylder disse kriterier.grep -v '[a-z]'
udskriver ikke denne linje, fordia
opfylder de negerede kriterier.