Vad är pythonekvivalenten för grep -v?

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

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ån a till z " men du ' har implementerat grep '[^a-z]' vilket betyder " inkludera vilken rad som helst som innehåller ett tecken inte i intervallet från a till z. " Om en rad har abc123 kommer din fråga att skriva ut den felaktigt eftersom 1 uppfyller dessa kriterier. grep -v '[a-z]' kommer inte att skriva ut den här raden eftersom a uppfyller de negerade kriterierna.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *