Podoba mi się grep -v
. Używam go cały czas. Ale zajmuję się też przetwarzaniem tekstu w Pythonie i jest jedna kluczowa rzecz, której mi brakuje.
Zwykle używam grep -v
, aby usunąć zbędne rzeczy z tekst.
Na przykład
$ grep -v "[a-z]" # (I manually review this output to confirm that I don"t want those lines) $ grep "[a-z]" > linesiwanted
Ale jak dopasować dopełnienie wyrażenia regularnego w Pythonie? Na przykład uzupełnienie \w
?
Komentarze
- patrz stackoverflow.com/questions/164414/…
- Tam ' sa podobna dyskusja na temat grepa w Pythonie na SO: stackoverflow.com/questions/1921894/grep-and-python , to pytanie bardziej konkretna wersja tego
- \ w = dowolne słowo char \ W = dowolny znak inny niż słowo
Odpowiedź
Wyrażenie regularne w Pythonie metoda search
lub match
zwraca obiekt Match
lub None
. Dla odpowiednika grep -v
możesz użyć:
import re for line in sys.stdin: if re.search(r"[a-z]", line) is None: sys.stdout.write(line)
Lub bardziej zwięźle:
import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r"[a-z]", line) is None])
Komentarze
- +1 link SO w komentarzu wspomina o twierdzeniach o negatywnym wyglądzie, ale szczerze mówiąc, myślę, że twój fragment jest znacznie bardziej rozsądny i elegancki. dzięki.
- okazuje się, że możesz również użyć [^ az], aby dopasować dopełnienie zestawu [az]
Odpowiedź
Okazuje się, że możesz po prostu użyć [^ az] na oznaczenie grep -v [a-z]
.
Używam tego jak :
#!/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
Komentarze
- To nie to samo.
grep -v '[a-z]'
oznacza " wyklucza każdą linię zawierającą znak z zakresu oda
doz
", ale Ty ' został zaimplementowanygrep '[^a-z]'
, co oznacza, że " zawiera dowolny wiersz zawierający znak spoza zakresu oda
toz
. " Jeśli linia maabc123
, to zapytanie błędnie je wydrukuje, ponieważ1
spełnia te kryteria.grep -v '[a-z]'
nie wydrukuje tej linii, ponieważa
spełnia zanegowane kryteria.