2017-02-10 113 views
1

我的示例文本中提取數據是按如下:的Python /正則表達式 - 與分裂

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 
""" 

什麼我嘗試acheive是讓每個部分的描述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) 

這很混亂,以前的嘗試更接近。

有誰知道我可以如何將每個部分的數據放到一條線上或更好的方式來做到這一點?

由於

+0

你是否正在將整個文件讀入一個變量? –

+0

它不是一個文件,當我的ssh腳本運行一個命令從設備上獲取庫存時,它被放入一個變量中 – AlexW

+0

好吧,我想你可能會用['re.findall(r'NAME:\ s) * 「([^」] *) 「\ S * DESCR:\ S * 」[^「] *」 \ S * PID:\ S *(\ S +)\ S *,\ S * VID:\ S * \ S * \ s *,\ s * SN:\ s *(\ S +)',data)'](https://regex101.com/r/dzm2Aq/1)。 –

回答

0

以下:

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爲每個條目。

0

使用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將是正確的條件。 你必須自己調整:)