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
- katso stackoverflow.com/questions/164414/…
- Siellä ' sa vastaava keskustelu grepistä pythonissa SO: ssa: stackoverflow.com/questions/1921894/grep-and-python , tämä kysymys tarkempi versio siitä
- \ w = mikä tahansa sana char \ W = mikä tahansa muu sana char
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 alueellaa–z" mutta sinä ' ve toteutettugrep '[^a-z]', mikä tarkoittaa, että " sisältää minkä tahansa rivin, joka sisältää merkin ei alueellaa–z. " Jos rivillä onabc123, kyselysi tulostaa sen virheellisesti, koska1täyttää nämä ehdot.grep -v '[a-z]'ei tulosta tätä riviä, koskaatäyttää hylätyt ehdot.