Mikä on grep -v: n python-ekvivalentti?

Pidän grep -v. Käytän sitä koko ajan. Mutta teen myös tekstinkäsittelyä pythonissa, ja puuttuu yksi tärkeä asia.

Käytän yleensä grep -v ottaaksesi ylimääräisiä juttuja ulos teksti.

Esimerkiksi

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

Mutta miten sovitan regexin täydennyksen Pythoniin? Esimerkiksi \w?

Kommentit

vastaus

Regex Pythonissa joko search – tai match -menetelmät palauttaa objektin Match tai None. grep -v -vastaavaksi saatat käyttää:

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

Tai tarkemmin:

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

Kommentit

  • +1 kommentin SO-linkissä mainitaan negatiivisen näköiset väitteet, mutta rehellisesti sanottuna katkelmani on mielestäni paljon järkevämpi ja tyylikkäämpi. kiitos.
  • käy ilmi, että voit myös käyttää [^ az] vastaamaan joukon [az] täydennystä.

Vastaa

Osoittautuu, että voit käyttää [^ az] tarkoittamaan grep -v [a-z].

Käytän sitä kuten :

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

Kommentit

  • Nämä eivät ole samat. grep -v '[a-z]' tarkoittaa " sulje pois kaikki rivit, jotka sisältävät merkin alueella az " mutta sinä ' ve toteutettu grep '[^a-z]', mikä tarkoittaa, että " sisältää minkä tahansa rivin, joka sisältää merkin ei alueella az. " Jos rivillä on abc123, kyselysi tulostaa sen virheellisesti, koska 1 täyttää nämä ehdot. grep -v '[a-z]' ei tulosta tätä riviä, koska a täyttää hylätyt ehdot.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *