grep -vに相当するPythonとは何ですか?

grep -vが好きです。いつも使っています。しかし、私はPythonでもテキスト処理を行っており、欠けている重要なことが1つあります。

通常、私は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

コメント

  • stackoverflow.com/questions/164414/ …
  • そこに' sa SOでのPythonのgrepに関する同様の議論: stackoverflow.com/questions/1921894/grep-and-python 、この質問のより具体的なバージョン
  • \ w =任意の単語文字\ W =任意の非単語文字

回答

正規表現Pythonでは、searchまたはmatchメソッドのいずれかが、Matchオブジェクトまたは

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リンクはネガティブルックアヘッドアサーションに言及していますが、正直なところ、あなたのスニペットははるかに賢明でエレガントだと思います。ありがとう。
  • [^ az]を使用してセットの補集合に一致させることもできます[az]

回答

[^ 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次に、はその基準を満たしています。 aが否定された基準を満たしているため、grep -v '[a-z]'はこの行を出力しません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です