Jeg liker grep -v
. Jeg bruker den hele tiden. Men jeg gjør også litt tekstbehandling i python, og det er en avgjørende ting som jeg mangler.
Vanligvis bruker jeg grep -v
for å ta fremmede ting ut av 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 til \w
?
Kommentarer
- se stackoverflow.com/questions/164414/…
- Der ' sa lignende diskusjon om grep i python på SO: stackoverflow.com/questions/1921894/grep-and-python , dette spørsmålet mer spesifikk versjon av det
- \ w = ethvert ord char \ W = ethvert ikke-ord char
Svar
Et regex I Python returnerer enten search
eller match
metodene et Match
-objekt eller None
. For grep -v
ekvivalent kan du bruke:
import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)
Eller mer kortfattet:
import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])
Kommentarer
- +1 SO-lenken i kommentaren nevner påstander om negativ utseende, men for å være ærlig synes jeg utdraget ditt er mye mer fornuftig og elegant. takk.
- det viser seg at du også kan bruke [^ az] til å matche komplementet til settet [az]
Svar
Det viser seg at du bare kan bruke [^ az] til å bety grep -v [a-z]
.
Jeg bruker 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
- Dette er ikke det samme.
grep -v '[a-z]'
betyr at " ekskluderer en linje som inneholder et tegn i området fraa
tilz
" men du ' har implementertgrep '[^a-z]'
som betyr " inkluderer hvilken som helst linje som inneholder et tegn ikke i området fraa
tilz
. " Hvis en linje harabc123
så vil spørsmålet ditt feilaktig skrive det ut fordi1
tilfredsstiller disse kriteriene.grep -v '[a-z]'
vil ikke skrive ut denne linjen fordia
oppfyller de negerte kriteriene.