Python の GREP

Manav Narula 2022年2月3日
Python の GREP

GREP は、正規表現を使用してプレーンテキストファイルで特定の行を検索できる興味深いコマンドライン機能です。

正規表現は Python で非常に頻繁に使用され、文字列がパターンに一致するかどうかを確認するために使用できます。

Python の re モジュールを使用すると、正規表現を処理できます。次のコードでは、Python で GREP を実装し、ファイルで特定のパターンを検索します。

with open("sample.txt", "r") as file:
    for line in file:
        if re.search(pattern, line):
            print(line)

必要なファイルを読み取りモードで開き、ファイルを 1 行ずつ繰り返します。次に、re.search() 関数を使用して、すべての行のパターンを検索します。パターンが見つかった場合は、その行が出力されます。

Python を使用してコマンドラインでこれを実装する別の巧妙な方法があります。このメソッドは、ターミナルでファイルを実行しているときに、コマンドラインで検索する正規表現とファイルを指定します。これにより、Python で GREP を適切に複製できます。

次のコードはこれを実装しています。

import re
import sys

with open(sys.argv[2], "r") as file:
    for line in file:
        if re.search(sys.argv[1], line):
            print(line)

sys モジュールは、コマンドラインで提供されたすべての引数の配列を返す argv() 関数を提供します。

このファイルを grep.py として保存し、ターミナルからこの Python スクリプトを実行して、次の方法で必要な引数を指定できます。

python grep.py 'RE' 'file-name'

複数の引数を処理する場合は、glob モジュールを使用できます。

glob モジュールを使用すると、ディレクトリ内のパターンに一致するファイルのパスを見つけることができます。

Python で GREP を複製する際の使用法を以下に示します。

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,
                )

iglob() 関数は、関数に渡されるディレクトリ内のファイルを返すオブジェクトを作成します。

ほんの数行で GREP を実装するもう 1つの簡潔な方法を以下に示します。

import re
import sys

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

この方法はより正確でメモリ効率が高く、これらの回線をターミナルで直接実行できます。

python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn