Wat is het python-equivalent van grep -v?

Ik vind grep -v leuk. Ik gebruik het de hele tijd. Maar ik ben ook bezig met tekstverwerking in Python, en er is één cruciaal ding dat ik mis.

Meestal gebruik ik grep -v om vreemde dingen uit tekst.

Bijvoorbeeld,

$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted 

Maar hoe kan ik het complement van een regex in Python matchen? Bijvoorbeeld, het complement van \w?

Reacties

Answer

Een regex in Python retourneert ofwel de search of match methoden een Match object of None. Voor grep -v equivalent, kunt u gebruiken:

 import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)  

Of beknopter:

 import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])  

Reacties

  • +1 de SO-link in de opmerking noemt negatief-lookahead beweringen, maar om eerlijk te zijn denk ik dat je fragment veel verstandiger en eleganter is. bedankt.
  • het blijkt dat je ook [^ az] kunt gebruiken om het complement van de set [az] te matchen.

Antwoord

Het blijkt dat je [^ az] gewoon kunt gebruiken om grep -v [a-z] te bedoelen.

Ik gebruik het als :

 #!/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  

Reacties

  • Deze zijn niet hetzelfde. grep -v '[a-z]' betekent " sluit elke regel uit die een teken in het bereik bevat van a tot z " maar jij ' ve geïmplementeerd grep '[^a-z]' wat betekent dat " elke regel bevat met een teken niet in het bereik van a tot z. " Als een regel abc123, dan zal uw vraag het foutief afdrukken omdat 1 voldoet aan die criteria. grep -v '[a-z]' zal deze regel niet afdrukken omdat a voldoet aan de ontkende criteria.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *