Каков эквивалентный способ написания этой программы sed в Python с использованием библиотеки re? Этот шаблон sed завершает поиск за один проход и его эффективность. Я пытаюсь извлечь номер модели процессора. Пожалуйста, смотрите мою 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
Sed:
/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 (не работает):
Мой код ищет каждое выражение и не ' t следовать любым правилам вложенности, что неэффективно. Ищите лучший способ написать это.
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())