【问题标题】:Select Substring from Larger String and Append to List从较大的字符串中选择子字符串并附加到列表
【发布时间】:2022-01-18 05:59:27
【问题描述】:

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

  • 身份证
  • 状态
  • is_archived
  • 目标
  • scan_uuid
  • 重新索引
  • time_start(unix 格式)
  • time_end(unix 格式)

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

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

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}\
]}'

【问题讨论】:

    标签: python select split substring extract


    【解决方案1】:

    基本上你可以使用标准的json模块来解析json字符串。
    使用该代码 sn-p 您可以获得一个可以使用的 dict。

    import json
    c = json.loads(scan_id_10_response)
    

    现在您可以创建一个包含所需属性的列表列表:

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

    此特定示例的返回值:

    [[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'])
    

    如果您不想使用 dict,我建议您查看正则表达式。

    【讨论】:

    • 试一试,非常完美,非常感谢!如果我不得不在数据不是 json 字符串的情况下做类似的事情,你知道怎么做吗?或者指出我正确的方向?
    • @CunnyFunt 这在一定程度上取决于字符串的格式。在简单的情况下,您可以只使用字符串处理。在更困难的情况下,您可以使用regex。在这里我推荐作弊表和测试游乐场here - 你需要编写与你想要的模式匹配的正则表达式
    猜你喜欢
    • 2016-07-03
    • 2013-05-21
    • 2018-09-13
    • 2012-09-14
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多