Python 中的 GREP

Manav Narula 2021年4月29日
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)

我們以讀取模式開啟所需的檔案,並逐行遍歷檔案。然後,我們使用 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 的方法。

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