Select 来自较大字符串的子字符串并追加到列表

Select Substring from Larger String and Append to List

我目前正在使用 Tenable.io 做一些 API 工作,但在 selecting 子字符串时遇到了一些问题。我正在发送扫描历史请求,API 以 JSON 格式的所有扫描的连续字符串作为响应。我得到的响应是一个非常大的连续数据字符串,我需要 select 一些子字符串(一些值),然后将其复制到列表中(暂时)。将数据放入列表并不是我遇到的问题 - 我需要一些认真的帮助 selecting 我需要的子字符串。每次扫描都有以下属性:

其中每一个后面都有一个 value/boolean(见下文)。我需要一种方法来从字符串中提取 "id":"scan_uuid:""time_start": 之后的值(暂时将其放入列表中)。

我想在没有 string.index 的情况下执行此操作,因为如果响应长度发生变化,这可能会破坏脚本。每天还有一个新的扫描,因此响应的总长度会发生变化。由于数据的性质,我想理想的解决方案是指定一个条件,该条件将 select x "id":"scan_uuid:" 和 [=15= 之后的字符数],并将它们附加到列表中,输出类似于:

scan_id_10_response = ["12345678", ""15b6e7cd-447b-84ab-84d3-48a62b18fe6c", "1639111111", etc, etc]

下面是字符串 - 为简单起见,我只包含了 4 次扫描的数据。出于安全原因,我也更改了值,但值的长度和格式是相同的。

scan_id_10_response = '{"pagination":{"offset":0,"total":119,"sort":[{"order":"DESC","name":"start_date"}],"limit":100},"history":[\
{"id":12345678,"status":"completed","is_archived":false,"targets":{"custom":false,"default":null},"visibility":"public","scan_uuid":"15b6e7cd-447b-84ab-84d3-48a62b18fe6c","reindexing":null,"time_start":1639111111,"time_end":1639111166},\
{"id":23456789,"status":"completed","is_archived":false,"targets":{"custom":false,"default":null},"visibility":"public","scan_uuid":"8a468cff-c64f-668a-3015-101c218b68ae","reindexing":null,"time_start":1632222222,"time_end":1632222255},\
{"id":34567890,"status":"completed","is_archived":false,"targets":{"custom":false,"default":null},"visibility":"public","scan_uuid":"84ea995a-584a-cc48-e352-8742a38c12ff","reindexing":null,"time_start":1639333333,"time_end":1639333344},\
{"id":45678901,"status":"completed","is_archived":false,"targets":{"custom":false,"default":null},"visibility":"public","scan_uuid":"48a95366-48a5-e468-a444-a4486cdd61a2","reindexing":null,"time_start":1639444444,"time_end":1639444455}\
]}'

基本上您可以使用标准 json 模块来解析 json 字符串。
使用该代码片段,您可以获得一个可以使用的字典。

import json
c = json.loads(scan_id_10_response)

例如,现在您可以创建具有所需属性的列表列表:

extracted_data = [[d['id'], d['scan_uuid'], d['time_start']] for d in c['history']]

这个 returns 对于这个特定的例子:

[[12345678, '15b6e7cd-447b-84ab-84d3-48a62b18fe6c', 1639111111], 
 [23456789, '8a468cff-c64f-668a-3015-101c218b68ae', 1632222222], 
 [34567890, '84ea995a-584a-cc48-e352-8742a38c12ff', 1639333333], 
 [45678901, '48a95366-48a5-e468-a444-a4486cdd61a2', 1639444444]]

如果您一次只想要一个结果,请使用生成器或遍历列表

gen_extracted = ([d['id'], d['scan_uuid'], d['time_start']] for d in x['history'])

如果您不想使用字典,我建议您看一下正则表达式。