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
は印刷されません
自然な問題は、なぜ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,
簡潔でメモリ効率が良い:
#!/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"
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
最初
sys.argv
を使用して、コマンドラインパラメーターを取得しますopen()
、read()
を使用してファイルを操作します実際の問題は、変数行に常に値があることです。 「一致が見つかりません」のテストは、一致があるかどうかであるため、コード「if line == None:」を「else:」に置き換える必要があります。