Jag gillar grep -v
. Jag använder det hela tiden. Men jag gör också lite textbehandling i python, och det är en viktig sak som jag saknar.
Vanligtvis använder jag grep -v
för att ta bort främmande saker ur text.
Till exempel
$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted
Men hur matchar jag komplementet till en regex i Python? Till exempel komplementet av \w
?
Kommentarer
- se stackoverflow.com/questions/164414/…
- Där ' sa liknande diskussion om grep i python på SO: stackoverflow.com/questions/1921894/grep-and-python , den här frågan mer specifik version av det
- \ w = valfritt ord char \ W = valfritt tecken utan ord
Svar
En regex i Python, antingen search
eller match
-metoderna, returnerar ett Match
-objekt eller None
. För grep -v
motsvarande kan du använda:
import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)
Eller mer kortfattat:
import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])
Kommentarer
- +1 SO-länken i kommentaren nämner påståenden om negativa lookahead men för att vara ärlig tycker jag att ditt utdrag är mycket mer förnuftigt och elegant. tack.
- det visar sig att du också kan använda [^ az] för att matcha komplementet till uppsättningen [az]
Svar
Det visar sig att du bara kan använda [^ az] för att betyda grep -v [a-z]
.
Jag använder 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
- Dessa är inte desamma.
grep -v '[a-z]'
betyder " utesluter alla rader som innehåller ett tecken i intervallet fråna
tillz
" men du ' har implementeratgrep '[^a-z]'
vilket betyder " inkludera vilken rad som helst som innehåller ett tecken inte i intervallet fråna
tillz
. " Om en rad harabc123
kommer din fråga att skriva ut den felaktigt eftersom1
uppfyller dessa kriterier.grep -v '[a-z]'
kommer inte att skriva ut den här raden eftersoma
uppfyller de negerade kriterierna.