首页 > 解决方案 > 如何将字符串的错误转储转换为字典

问题描述

我有以下字符串。如何将其转换为 python 字典和 json 字典?

str1 = ('\n'
 'slot  1\n'
 '=======\n'
 '\n'
 '\n'
 'Flags: F - Fragment entry  E - Port Expansion\n'
 '       D - DSCP Expansion  M - ACL Expansion\n'
 '       T - Cross Feature Merge Expansion\n'
 '\n'
 '\n'
 'INSTANCE 0x0\n'
 '---------------\n'
 '\n'
 '  Tcam 1 resource usage:\n'
 '  ----------------------\n'
 '  Label_b = 0x8\n'
 '   Bank 0\n'
 '   ------\n'
 '     IPv4 Class\n'
 '       Policies: PBR(RM_OUT)  [Merged]\n'
 '       Netflow profile: 0\n'
 '       Netflow deny profile: 0\n'
 '       Entries: \n'
 '         [Index] Entry [Stats]\n'
 '         ---------------------\n'
 '  [041f:159c2:040b] prec 1 permit-routed ip 0.0.0.0/0 224.0.0.0/4  '
 '[12479340]\n'
 '  [0439:14bd0:0425] prec 1 redirect(0x20538)-routed tcp 98.125.94.75/32 eq '
 '8000 0.0.0.0/0  [0]\n'
 '  [043a:1db48:0426] prec 1 redirect(0x20538)-routed tcp 98.125.94.75/32 eq '
 '7066 0.0.0.0/0 flow-label 655360  [0]\n')

下面是示例预期输出:

StrDict1 = {'INSTANCE': '0x0', 'TCAM': 'Tcam 1 Bank 0', 'Policies': 'RM_OUT', 'redirect(0x20534)': ['98.125.96.0/22', 'tcp 98.125.96.0/22 eq 8850', '98.125.96.0/22 eq 443'], 'redirect(0x20538)': ['tcp 98.125.96.0/22 range 8848 8849', '98.125.88.0/21 eq 8850']}

输出字典应将同一重定向的所有 IP/子网条目放在同一列表下。这只是一个例子。输出可能是包含 1000 行的大字典,具体取决于需要转换为字典的字符串中的数据。

标签: pythonpython-3.x

解决方案


首先,您需要进行一些词法分析,即创建从文本中提取关键字和 IP 地址以及其他部分的迭代器:

HEX_VALUE = 0
IP_VALUE = 1
...
def lex(text):
   for line in text:
      line = line.strip()
      if line == '':
          continue
      if <some regex>:
         yield 'INSTANCE',  'INSTANCE' # type of token and its value
         continue
      if < some other regex>:
          yield IP_VALUE, '10.0.0.1'
     # and so on

那么解析这种数据的方法是创建“有限自动机”来实现语法分析。您从一些作为状态的变量开始,并为其赋予初始值:

state = 'seek for INSTANCE'

然后循环令牌:

result = dict()
for token, value in lex(str1):
    if state == 'seek for INSTANCE':
        if token != 'INSTANCE':
            continue # ignore everything before 'INSTANCE'
        state = 'GET INSTANCE VALUE'
        continue
    if state == 'GET INSTANCE VALUE':
       if token != HEX_VALUE:
           #some error
       result['INSTANCE'] = value
       state = 'WAIT for TCAM'
       continue

将更多“智能”放在词法分析部分还是语法部分取决于您。


推荐阅读