アーロン :
再ライブラリを使用して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)
効率について - 限り、あなたがパースに文字列の何百万を持っていないとして、あなたはそれを心配する必要はありません。