Co to jest odpowiednik grep -v w pythonie?

14

Lubię grep -v. Używam tego cały czas. Ale przetwarzam też tekst w Pythonie i brakuje mi jednej kluczowej rzeczy.

Zazwyczaj używam grep -vdo usuwania obcych tekstów.

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?

ixtmixilix
źródło
Podobna dyskusja na temat grep w pythonie na SO: stackoverflow.com/questions/1921894/grep-and-python , to bardziej szczegółowa wersja tego pytania
icc97
\ w = dowolne słowo char \ W = dowolne słowo char
Kasapo

Odpowiedzi:

17

Wyrażenie regularne w Pythonie ( metody searchlub match) zwraca Matchobiekt lub None. Dla grep -vodpowiednika 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])
Arcege
źródło
+1 w linku SO w komentarzu wspomina o negatywnych stwierdzeniach z wyprzedzeniem, ale szczerze mówiąc, myślę, że Twój fragment kodu jest znacznie bardziej rozsądny i elegancki. dzięki.
ixtmixilix
okazuje się, że można również użyć [^ az], aby dopasować dopełnienie zestawu [az]
ixtmixilix
1

Okazuje się, że możesz po prostu użyć [^ az] 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
ixtmixilix
źródło
To nie to samo. grep -v '[a-z]'oznacza „wyklucz dowolną linię zawierającą znak z zakresu od ado z”, ale zaimplementowałeś grep '[^a-z]'co oznacza „dołącz dowolną linię zawierającą znak spoza zakresu od ado z”. Jeśli wiersz zawiera, abc123zapytanie zostanie wydrukowane błędnie, ponieważ 1spełnia te kryteria. grep -v '[a-z]'nie wydrukuje tego wiersza, ponieważ aspełnia zanegowane kryteria.
Adam Katz,