Apa persamaan python dari grep -v?

14

Saya suka grep -v. Saya menggunakannya sepanjang waktu. Tetapi saya juga melakukan beberapa pemrosesan teks dengan python, dan ada satu hal penting yang saya kekurangan.

Biasanya, saya menggunakan grep -vuntuk mengambil hal-hal asing dari teks.

Contohnya,

$ grep -v '[a-z]'
# (I manually review this output to confirm that I don't want those lines)

$ grep '[a-z]' > linesiwanted

Tapi bagaimana cara mencocokkan komplemen regex dengan Python? Misalnya, pelengkap dari \w?

ixtmixilix
sumber
Ada diskusi serupa tentang grep di python pada SO: stackoverflow.com/questions/1921894/grep-and-python , pertanyaan ini versi yang lebih spesifik tentang itu
icc97
\ w = sembarang kata char \ W = sembarang arang non-kata
Kasapo

Jawaban:

17

Regex dengan Python, baik metode searchatau match, mengembalikan Matchobjek atau None. Untuk yang grep -vsetara, Anda dapat menggunakan:

import re
for line in sys.stdin:
    if re.search(r'[a-z]', line) is None:
        sys.stdout.write(line)

Atau lebih ringkas:

import re; sys.stdout.writelines([line for line in sys.stdin if re.search(r'[a-z]', line) is None])
Arcege
sumber
Memberi +1 tautan SO dalam komentar menyebutkan pernyataan yang terlihat negatif tetapi sejujurnya saya pikir cuplikan Anda jauh lebih masuk akal dan elegan. Terima kasih.
ixtmixilix
ternyata Anda juga bisa menggunakan [^ az] untuk mencocokkan pelengkap dari set [az]
ixtmixilix
1

Ternyata Anda bisa menggunakan [^ az] untuk maksud grep -v [a-z].

Saya menggunakannya seperti:

#!/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
sumber
Ini tidak sama. grep -v '[a-z]'berarti "kecualikan setiap baris yang mengandung karakter dalam rentang dari ake z" tetapi Anda telah mengimplementasikannya grep '[^a-z]'yang berarti "sertakan setiap baris yang mengandung karakter yang tidak dalam rentang dari ake z." Jika suatu baris memiliki, abc123maka kueri Anda akan mencetaknya secara keliru karena 1memenuhi kriteria itu. grep -v '[a-z]'tidak akan mencetak baris ini karena amemenuhi kriteria yang dinegasikan.
Adam Katz