结构半结构化文本
structifytext的Python项目详细描述
结构半结构化文本,在分析命令行输出时很有用 从网络设备。
它是什么
如果你在读这篇文章,你可能会被指派
以编程方式从cli驱动的设备检索信息,并
你必须说到点子上
你有一段很好的文字,然后对自己说,“哇,我希望
它只是返回了一些我可以处理的结构化内容,比如json
或其他键/值格式。
这就是structifytext试图提供帮助的地方。它让你定义 你希望的有效载荷回来了 它是正则表达式!
安装
使用pip:
pip install structifytext
来源
make install
用法
将文本和“structure”(python字典)传递给parsermodulesparsemethod。
from structifytext import parser output = """ eth0 Link encap:Ethernet HWaddr 00:11:22:3a:c4:ac inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:147142475 errors:0 dropped:293854 overruns:0 frame:0 TX packets:136237118 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:17793317674 (17.7 GB) TX bytes:46525697959 (46.5 GB) eth1 Link encap:Ethernet HWaddr 00:11:33:4a:c8:ad inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::225:90ff:fe4a:c8ad/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:51085118 errors:0 dropped:251 overruns:0 frame:0 TX packets:3447162 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4999277179 (4.9 GB) TX bytes:657283496 (657.2 MB) """ struct = { 'interfaces': [{ 'id': '(eth\d{1,2})', 'ipv4_address': 'inet addr:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', 'mac_address': 'HWaddr\s((?:[a-fA-F0-9]{2}[:|\-]?){6})' }] } parsed = parser.parse(output, struct) print parsed
这将返回python字典
{ 'interfaces': [ { 'id': 'eth0', 'ipv4_address': '192.168.1.2', 'mac_address': '00:11:22:3a:c4:ac' }, { 'id': 'eth1', 'ipv4_address': '192.168.1.3', 'mac_address': '00:11:33:4a:c8:ad' } ] }
您可以随意使用它,也可以作为rest服务的一部分返回json…
结构
一个stuct、一个structure、一个payload或者任何你拥有的东西,仅仅是一个
类似于您希望得到的内容的字典。
值可以是字典{}、列表[],也可以是
正则表达式字符串[a-z](\d)带有一个组(要填充
值)。
结构被递归地解析,填充 提供输入文本值的字典/结构。
通常,半结构化文本的类似部分在
您试图分析的文本。
要解析这些文本部分,我们定义了一个字典,其键为
无论是id还是block_start,差别是block_start
键/值从结果输出中删除。
这个id或block_start标记每个
您希望解析的“块”。
可以通过指定
block_end键和正则表达式值。
这里有一个例子很有用。
例如,以下结构。
{ 'tables': [ { 'id': '\[TABLE (\d{1,2})\]', 'flows': [ { 'id': '\[FLOW_ID(\d+)\]', 'info': 'info\s+=\s+(.*)' } ] } ] }
将从以下输出创建“chunk/block”
[TABLE 0] Total entries: 3 [FLOW_ID1] info = related to table 0 flow 1 [TABLE 1] Total entries: 31 [FLOW_ID1] info = related to table 1 flow 1
将被解析为:
{ 'tables': [{ 'id': '0', 'flows': [{ 'id': '1', 'info': 'related to table 0 flow 1' }], }, { 'id': '1', 'flows': [{ 'id': '1', 'info': 'related to table 1 flow 1' }] }] }
有关更多用法示例,请参见tests/test_parser_api.py下的。