Grep -v'nin python eşdeğeri nedir?


14

Sevdim grep -v. Her zaman kullanıyorum. Ama aynı zamanda python'da bazı metin işlemleri yapıyorum ve eksik olduğum önemli bir şey var.

Genellikle, grep -vgereksiz şeyleri metinden çıkarmak için kullanılır.

Örneğin,

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

$ grep '[a-z]' > linesiwanted

Python'daki normal ifadenin tamamlayıcısıyla nasıl eşleşirim? Örneğin, tamamlayıcısı \w?




\ w = herhangi bir kelime karakter \ W = kelime olmayan karakter
Kasapo

Yanıtlar:


17

Python'daki regex, ya searchda matchyöntemleri, bir Matchnesne ya da döndürür None. İçin grep -veşdeğer bir uygulama yapabilirsiniz:

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

Ya da daha kısaca:

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

+1 SO yorumda negatif-ileriye dönük iddialardan bahsediyor ama dürüst olmak gerekirse snippet'inizin çok daha mantıklı ve zarif olduğunu düşünüyorum. Teşekkürler.
ixtmixilix

çıkıyor ki [^ az] ile [az] setinin tamamlayıcısını da kullanabilirsiniz
ixtmixilix

1

Anlaşılan, sadece [^ az] 'yı kullanabilirsiniz grep -v [a-z].

Şunun gibi kullanıyorum:

#!/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

Bunlar aynı değil. grep -v '[a-z]'vasıta "aralığında bir karakter içeren herhangi bir çizgiyi dışlamak aiçin z" ama uyguladık grep '[^a-z]'"bir karakter içeren herhangi bir satır ekleyin hangi vasıta değil aralığında aiçin z." Bir satır varsa abc123, sorgunuz yanlışlıkla 1bu ölçütleri karşıladığından yazdırır . reddedilen kriterleri karşıladığından grep -v '[a-z]'bu satırı yazdırmaz a.
Adam Katz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.