[英]create a dictionary from file 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))
你可以試試這個:
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'}}
您可以使用嵌套的 dict 理解以及外部和內部正則表達式。
^\s* # start of line + whitespaces, eventually
(?P<key>\.[\d.]+)\s* # the key
{(?P<values>[^{}]+)} # everything between { and }
就正則表達式而言,這可以表述為
^\\s* # start of line + whitespaces, eventually (?P<key>\\.[\\d.]+)\\s* # the key {(?P<values>[^{}]+)} # everything between { and }
如您所見,我們將這些部分拆分為鍵/值對。
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)
rx_outer = re.compile(r'^\\s*(?P<key>\\.[\\d.]+)\\s*{(?P<values>[^{}]+)}', re.MULTILINE) rx_inner = re.compile(r'(?P<key>\\b[AZ][-/\\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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.