Pythonの再を使用してマルチパターンネストされた正規表現

アーロン :

再ライブラリを使用してPythonでこのsedのプログラムを書くための同等の方法は何ですか?このsedのパターンは、1つのパスとその効率的に検索を完了します。私は、CPUのモデル番号を抽出しようとしています。一番下の私のPythonコードの試みを参照してください。

サンプル入力:

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz
stepping        : 6

出力:

E5-2660

サンプル入力2:

processor       : 127
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7601 32-Core Processor
stepping        : 2

出力:

EPYC 7601

しかし、

/AuthenticAMD/{
    s/.*/AMD/p
}
/GenuineIntel/ {
    n
    n
    n
    /Celeron/ {            
        s/.*\([egptEGPT][1-9][0-9][0-9][0-9][a-zA-Z][a-zA-Z]\).*/\1/p 
        s/.*\([egptEGPT][1-9][0-9][0-9][0-9][a-zA-Z]\).*/\1/p 
        s/.*\([egptEGPT][1-9][0-9][0-9][0-9]\).*/\1/p
        q
    }
    /Xeon/ {
        s/.*[eE][3579]-\([1-9][1-9][1-9][1-9]\).*/\1/p
        s/.*\([eElL]C[1-9][0-9][0-9][0-9]\).*/\1/p
        s/.*\([35][0-9][0-9][0-9]\).*/\1/p
        q
    }
}

Pythonでしようとする(動作しません):

私のコードは、すべての式を検索し、効率的ではありませんこれは、任意のネストの規則に従っていません。これを書くためのより良い方法を探しています。

string = """processor       : 0
            vendor_id       : GenuineIntel
            cpu family      : 6
            model           : 45
            model name      : Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz
            stepping        : 6"""

pattern = r'''GenuineIntel.*
                (?=Celeron
                    .*([egptEGPT][1-9][0-9][0-9][0-9][a-zA-Z][a-zA-Z]).*
                    .*([egptEGPT][1-9][0-9][0-9][0-9][a-zA-Z]).*
                    .*([egptEGPT][1-9][0-9][0-9][0-9]).*)|
                (?=Xeon
                    .*([eE][3579]-[1-9][0-9][0-9][0-9]).*)'''

print(re.search(pattern, string, re.MULTILINE|re.DOTALL|re.VERBOSE).groups())
Tupteq:

Pythonのような十分な機能言語ととてもよく構造化されたデータを持つことは、私は正規表現を使用して、すべてを解析しようとしないでしょう。代わりに、私は非常に最後に正規表現を使用して、仕事をして、コードを書いたと思います。この方法ではなく、巨大な正規表現は、私は非常に単純な正規表現を使用してコードを読み取る短く、簡単に持っています。

data = {}
for line in string.split("\n"):
    left, right = line.split(":")
    data[left.strip()] = right.strip()

if data["vendor_id"] == "GenuineIntel":
    model = data["model name"]
    if "Xeon" in model:
        code = re.search(r"\bE\d-\d{4}\b", model, re.I).group(0)
    elif "Celeron" in model:
        code = re.search(r"\b[EGPT]\d{4}[a-z]{0,2}\b", model, re.I).group(0)

print(code)

効率について - 限り、あなたがパースに文字列の何百万を持っていないとして、あなたはそれを心配する必要はありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=28734&siteId=1