Hvad er pythonækvivalenten med grep -v?

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

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 fra a til z " men du ' har implementeret grep '[^a-z]' hvilket betyder " inkluderer enhver linje, der indeholder et tegn ikke i området fra a til z. " Hvis en linje har abc123 så vil din forespørgsel fejlagtigt udskrive den, fordi 1 opfylder disse kriterier. grep -v '[a-z]' udskriver ikke denne linje, fordi a opfylder de negerede kriterier.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *