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, koska1
täyttää nämä ehdot.grep -v '[a-z]'
ei tulosta tätä riviä, koskaa
täyttää hylätyt ehdot.