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]'
はこの行を出力しません。