Select 来自较大字符串的子字符串并追加到列表
Select Substring from Larger String and Append to List
我目前正在使用 Tenable.io 做一些 API 工作,但在 selecting 子字符串时遇到了一些问题。我正在发送扫描历史请求,API 以 JSON 格式的所有扫描的连续字符串作为响应。我得到的响应是一个非常大的连续数据字符串,我需要 select 一些子字符串(一些值),然后将其复制到列表中(暂时)。将数据放入列表并不是我遇到的问题 - 我需要一些认真的帮助 selecting 我需要的子字符串。每次扫描都有以下属性:
- id
- 状态
- is_archived
- 目标
- scan_uuid
- 重建索引
- time_start(unix 格式)
- time_end(unix 格式)
其中每一个后面都有一个 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'])
如果您不想使用字典,我建议您看一下正则表达式。
我目前正在使用 Tenable.io 做一些 API 工作,但在 selecting 子字符串时遇到了一些问题。我正在发送扫描历史请求,API 以 JSON 格式的所有扫描的连续字符串作为响应。我得到的响应是一个非常大的连续数据字符串,我需要 select 一些子字符串(一些值),然后将其复制到列表中(暂时)。将数据放入列表并不是我遇到的问题 - 我需要一些认真的帮助 selecting 我需要的子字符串。每次扫描都有以下属性:
- id
- 状态
- is_archived
- 目标
- scan_uuid
- 重建索引
- time_start(unix 格式)
- time_end(unix 格式)
其中每一个后面都有一个 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'])
如果您不想使用字典,我建议您看一下正则表达式。