Що таке пітонний еквівалент grep -v?


14

Мені подобається grep -v. Я ним користуюся постійно. Але я також роблю деяку обробку тексту в python, і є одна важлива річ, якої мені бракує.

Зазвичай я grep -vвиймаю сторонні речі з тексту.

Наприклад,

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

$ grep '[a-z]' > linesiwanted

Але як я можу зіставити доповнення з регулярним виразом у Python? Наприклад, доповнення \w?



Існує подібна дискусія щодо grep в python на SO: stackoverflow.com/questions/1921894/grep-and-python , це питання більш конкретна версія цього
icc97

\ w = будь-яке слово char \ W = будь-яке не слово char
Kasapo

Відповіді:


17

Регекс в Python, searchабо matchметод, повертає Matchоб'єкт або None. Для grep -vеквівалента ви можете використовувати:

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

Або більш стисло:

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

+1 Посилання ТА у коментарі згадує негативні твердження, але якщо чесно, я вважаю, що ваш фрагмент набагато більш розумний та елегантний. Спасибі.
ixtmixilix

виявляється, ви також можете використовувати [^ az], щоб відповідати доповненню множини [az]
ixtmixilix

1

Виявляється, ви можете просто використовувати [^ az] для значення grep -v [a-z].

Я використовую його так:

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

Це не те саме. grep -v '[a-z]'означає "виключити будь-який рядок, що містить символ у діапазоні від aдо z", але ви реалізували, grep '[^a-z]'що означає "включити будь-яку рядок, що містить символ, який не знаходиться в діапазоні від aдо z". Якщо рядок є, abc123то ваш запит буде помилково надрукувати його, оскільки 1відповідає цим критеріям. grep -v '[a-z]'не надрукує цей рядок, оскільки aвідповідає запереченим критеріям.
Адам Кац
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.