Jaki jest odpowiednik grep -v w Pythonie?

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

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 od a do z ", ale Ty ' został zaimplementowany grep '[^a-z]', co oznacza, że " zawiera dowolny wiersz zawierający znak spoza zakresu od a to z. " Jeśli linia ma abc123, 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *