web-dev-qa-db-ja.com

GrepおよびPython

Unixコマンドラインから正規表現を介してgrepを使用してファイルを検索する方法が必要です。たとえば、コマンドラインに入力する場合:

python pythonfile.py 'RE' 'file-to-be-searched'

正規表現'RE'をファイル内で検索し、一致する行を出力する必要があります。

ここに私が持っているコードがあります:

import re
import sys

search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
        print line,
        if line == None:
            print 'no matches found'

しかし、存在しない単語を入力すると、no matches foundは印刷されません

64
David

自然な問題は、なぜgrepを使用しないのかということです!しかし、できないと仮定して...

import re
import sys

file = open(sys.argv[2], "r")

for line in file:
     if re.search(sys.argv[1], line):
         print line,

注意事項:

  • searchの代わりにmatchを使用して、文字列内の任意の場所を検索します。
  • printの後のコンマ(,)はキャリッジリターンを削除します(行には1つがあります)
  • argvにはpythonファイル名が含まれるため、変数は1から開始する必要があります

これは、複数の引数(grepのように)を処理したり、ワイルドカード(Unixシェルのように)を展開したりしません。この機能が必要な場合は、次を使用して取得できます。

import re
import sys
import glob

for arg in sys.argv[2:]:
    for file in glob.iglob(arg):
        for line in open(file, 'r'):
            if re.search(sys.argv[1], line):
                print line,
74
Nick Fortescue

簡潔でメモリ効率が良い:

#!/usr/bin/env python
# file: grep.py
import re, sys

map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))

Egrepのように機能します(エラー処理が多すぎません)。例:

cat input-file | grep.py "RE"

そして、ここにワンライナーがあります:

cat input-file | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
13

pythonのgrep から適応。

[2:]を介してファイル名のリストを受け入れ、例外処理を行いません。

#!/usr/bin/env python
import re, sys, os

for f in filter(os.path.isfile, sys.argv[2:]):
    for line in open(f).readlines():
        if re.match(sys.argv[1], line):
            print line

sys.argv[1] resp sys.argv[2:]は、スタンドアロンの実行可能ファイルとして実行すると機能します。つまり、

chmod +x

最初

6
miku
  1. sys.argvを使用して、コマンドラインパラメーターを取得します
  2. open()read()を使用してファイルを操作します
  3. Python reモジュール を使用して行を一致させます
4
jldupont

pyp に興味があるかもしれません。他の引用 answer

「The Pyed Piper」、またはpypは、awkまたはsedに似たLinuxコマンドラインテキスト操作ツールですが、標準のpython文字列およびリストメソッド、およびカスタム関数を使用して進化し、厳しい生産環境。

2
Piotr Dobrogost

実際の問題は、変数行に常に値があることです。 「一致が見つかりません」のテストは、一致があるかどうかであるため、コード「if line == None:」を「else:」に置き換える必要があります。

0
richard