[英]Python/Regex - extracting data with split
我的示例文本如下:
data = """
NAME: "Chassis", DESCR: "Nexus5548 Chassis"
PID: N5K-C5548UP , VID: V01 , SN: SSI1F8A204LK
NAME: "Module 1", DESCR: "O2 32X10GE/Modular Universal Platform Supervisor"
PID: N5K-C5548UP , VID: V01 , SN: FOC1FS7Q2P
NAME: "Module 2", DESCR: "O2 16X10GE Ethernet Module"
PID: N55-M16P , VID: V01 , SN: FOC15840LYH
NAME: "Fan 1", DESCR: "Chassis fan module"
PID: N5548P-FAN , VID: N/A , SN: N/A
NAME: "Fan 2", DESCR: "Chassis fan module"
PID: N5548P-FAN , VID: N/A , SN: N/A
NAME: "Power supply 1", DESCR: "AC power supply"
PID: N55-PAC-750W , VID: V02 , SN: ART18790WA
NAME: "Power supply 2", DESCR: "AC power supply"
PID: N55-PAC-750W , VID: V02 , SN: ART182126V2
NAME: "Module 3", DESCR: "O2 Daughter Card with L3 ASIC"
PID: N55-D160L3-V2 , VID: V01 , SN: FOC14952NU2
"""
我試圖實現的是將每個部分的描述PID和序列分成一個類。
首先我認為id將它們全部放在一行上,然后將這些行分開,以便兩條線開始NAME:並且PID:將在同一條線上,一旦每條線在同一條線上,我就可以從每條線獲取數據。
我迄今為止的最新嘗試:
data = ''.join(sample.splitlines())
nd = re.split(r"(\NAME:)", data)
這將名稱放在自己的行上,而其余的行放在另一行上,這一行是關閉的但是我需要刪除所有只有NAME的行:on能夠迭代
data = ''.join(sample.splitlines())
nd = re.split(r"(SN:\s[\w\-]+)", data)
這很麻煩,之前的嘗試更接近了。
有誰知道我如何將每個部分的數據放到一行或更好的方式來做到這一點?
謝謝
下列:
import re
data = """
NAME: "Chassis", DESCR: "Nexus5548 Chassis"
PID: N5K-C5548UP , VID: V01 , SN: SSI1F8A204LK
NAME: "Module 1", DESCR: "O2 32X10GE/Modular Universal Platform Supervisor"
PID: N5K-C5548UP , VID: V01 , SN: FOC1FS7Q2P
NAME: "Module 2", DESCR: "O2 16X10GE Ethernet Module"
PID: N55-M16P , VID: V01 , SN: FOC15840LYH
NAME: "Fan 1", DESCR: "Chassis fan module"
PID: N5548P-FAN , VID: N/A , SN: N/A
NAME: "Fan 2", DESCR: "Chassis fan module"
PID: N5548P-FAN , VID: N/A , SN: N/A
NAME: "Power supply 1", DESCR: "AC power supply"
PID: N55-PAC-750W , VID: V02 , SN: ART18790WA
NAME: "Power supply 2", DESCR: "AC power supply"
PID: N55-PAC-750W , VID: V02 , SN: ART182126V2
NAME: "Module 3", DESCR: "O2 Daughter Card with L3 ASIC"
PID: N55-D160L3-V2 , VID: V01 , SN: FOC14952NU2
"""
matches = re.findall(r'NAME: \"(.*)\",\s*'
r'DESCR: \"(.*)\"\s*'
r'PID: (\S+)\s*,\s*'
r'VID: (\S+)\s*,\s*'
r'SN: (\S+)',
data,
re.MULTILINE)
print matches
將打印:
[('Chassis', 'Nexus5548 Chassis', 'N5K-C5548UP', 'V01', 'SSI1F8A204LK'), ('Module 1', 'O2 32X10GE/Modular Universal Platform Supervisor', 'N5K-C5548UP', 'V01', 'FOC1FS7Q2P'), ('Module 2', 'O2 16X10GE Ethernet Module', 'N55-M16P', 'V01', 'FOC15840LYH'), ('Fan 1', 'Chassis fan module', 'N5548P-FAN', 'N/A', 'N/A'), ('Fan 2', 'Chassis fan module', 'N5548P-FAN', 'N/A', 'N/A'), ('Power supply 1', 'AC power supply', 'N55-PAC-750W', 'V02', 'ART18790WA'), ('Power supply 2', 'AC power supply', 'N55-PAC-750W', 'V02', 'ART182126V2'), ('Module 3', 'O2 Daughter Card with L3 ASIC', 'N55-D160L3-V2', 'V01', 'FOC14952NU2')]
即每個條目的NAME,DESCR,PID,VID,SN元組。
使用python split()函數。 它將創建一個包含由空格分隔的字符串的每個部分的數組。 然后你可以通過split(“/ n”)迭代它,這將通過換行符拆分字符串。 碼:
for index,line in enumerate(data.split("/n")):
if (index - 2)%3 == 0:
PID = line.split()[1]
serial_number = line.split()[7]
# here add some code to save the PID and SN whereever you want...
上面的代碼將迭代每一行和每三行(從第二行開始)它將做一些事情 - 通過if (index - 2)%3 == 0:
條件實現。 然后它將按空格分割字符串,您可以通過索引找到所需的PID和序列。
只需注意比較行號的條件,因為我不確定index - 2
是否准確。 也許index - 1
將是正確的條件。 你必須自己調整:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.