grep -vと同等のPythonは何ですか?


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?の補数



SOのPythonのgrepについても同様の議論があります:stackoverflow.com/questions/1921894/grep-and-python、この質問のより具体的なバージョン
icc97

\ w =任意の単語の文字\ W =任意の非単語の文字
カサポ

回答:


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、この行は印刷されません。
アダムカッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.