Hva er pythonekvivalenten til grep -v?

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

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 fra a til z " men du ' har implementert grep '[^a-z]' som betyr " inkluderer hvilken som helst linje som inneholder et tegn ikke i området fra a til z. " Hvis en linje har abc123 så vil spørsmålet ditt feilaktig skrive det ut fordi 1 tilfredsstiller disse kriteriene. grep -v '[a-z]' vil ikke skrive ut denne linjen fordi a oppfyller de negerte kriteriene.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *