Что такое python-эквивалент 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 = любое слово non 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 ссылка SO в комментарии упоминает негативные утверждения, но, честно говоря, я думаю, что ваш фрагмент гораздо более разумный и элегантный. Благодарю.
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.