2017-10-17 238 views
2

我是新來的python,我正試圖讀取一個文件,並從它創建一個字典。 格式如下:從文件python創建一個字典

.1.3.6.1.4.1.14823.1.1.27 { 
    TYPE = Switch 
    VENDOR = Aruba 
    MODEL = ArubaS3500-48T 
    CERTIFICATION = CERTIFIED 
    CONT = Aruba-Switch 
    HEALTH = ARUBA-Controller 
    VLAN = Dot1q INSTRUMENTATION: 
    Card-Fault   = ArubaController:DeviceID 
    CPU/Memory   = ArubaController:DeviceID 
    Environment    = ArubaSysExt:DeviceID 
    Interface-Fault  = MIB2 
    Interface-Performance = MIB2 
    Port-Fault   = MIB2 
    Port-Performance  = MIB2 
} 

第一行OID(.1.3.6.1.4.1.14823.1.1.27 {)我希望這是鍵和其餘的行是值,直到}

我已經嘗試了幾種組合,但是無法獲得正確的正則表達式來匹配這些

請幫忙嗎?

我已經試過類似

lines = cache.readlines() 

for line in lines: 

    searchObj = re.search(r'(^.\d.*{)(.*)$', line) 

    if searchObj: 
     (oid, cert) = searchObj.groups() 

    results[searchObj(oid)] = ", ".join(line[1:]) 

    print("searchObj.group() : ", searchObj.group(1)) 

    print("searchObj.group(1) : ", searchObj.group(2)) 
+0

是的,它總是.1.3.6.1.4.x.x.x.x – D2D2

回答

1

你可以試試這個:

import re 
data = open('filename.txt').read() 
the_key = re.findall("^\n*[\.\d]+", data) 
values = [re.split("\s+\=\s+", i) for i in re.findall("[a-zA-Z0-9]+\s*\=\s*[a-zA-Z0-9]+", data)] 
final_data = {the_key[0]:dict(values)} 

輸出:

{'\n.1.3.6.1.4.1.14823.1.1.27': {'VENDOR': 'Aruba', 'CERTIFICATION': 'CERTIFIED', 'Fault': 'MIB2', 'VLAN': 'Dot1q', 'Environment': 'ArubaSysExt', 'HEALTH': 'ARUBA', 'Memory': 'ArubaController', 'Performance': 'MIB2', 'CONT': 'Aruba', 'MODEL': 'ArubaS3500', 'TYPE': 'Switch'}} 
1

你可以用外座使用嵌套的字典理解和內部的正則表達式。


你塊可以通過

.numbers...numbers.. { 
    // values here 
} 

分離。在正則表達式的計算,這可配製成

^\s*     # start of line + whitespaces, eventually 
(?P<key>\.[\d.]+)\s* # the key 
{(?P<values>[^{}]+)} # everything between { and } 

正如你看到的,我們的部分分成鍵/值對。


你的 「內部」 結構可配製像

(?P<key>\b[A-Z][-/\w]+\b) # the "inner" key 
\s*=\s*     # whitespaces, =, whitespaces 
(?P<value>.+)    # the value 


現在讓我們打造的 「外」 與 「內」 表情在一起:

rx_outer = re.compile(r'^\s*(?P<key>\.[\d.]+)\s*{(?P<values>[^{}]+)}', re.MULTILINE) 
rx_inner = re.compile(r'(?P<key>\b[A-Z][-/\w]+\b)\s*=\s*(?P<value>.+)') 

result = {item.group('key'): 
    {match.group('key'): match.group('value') 
    for match in rx_inner.finditer(item.group('values'))} 
    for item in rx_outer.finditer(string)} 
print(result) 

一個demo can be found on ideone.com