python - 如何将字符串的错误转储转换为字典
问题描述
我有以下字符串。如何将其转换为 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 行的大字典,具体取决于需要转换为字典的字符串中的数据。
解决方案
首先,您需要进行一些词法分析,即创建从文本中提取关键字和 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
将更多“智能”放在词法分析部分还是语法部分取决于您。
推荐阅读
- python - 如何避免 KeyError 丢失字典键?
- c - 提高 Vivado HLS 部门的性能
- java - 在 LinearLayout 中设置重力 - android
- perl - PERL:我从 locatime 中获取 mday 值,如下所示。如何从本地时间获取的 mday 中减去 1
- reactjs - 使用 React UI 和 Spring Boot 服务器实现用户搜索的建议
- html - 更改 DataTables 搜索栏的颜色
- python - Docker 不会安装 Python
- node.js - Nodejs在CSV中编辑单行
- flutter - 在颤动中对齐行内的项目
- javascript - 蒙版更改后光标在错误的位置