想从字典格式的字符串中获取值

Posted

技术标签:

【中文标题】想从字典格式的字符串中获取值【英文标题】:Want to get the value from the string which in dictionary format 【发布时间】:2021-07-02 05:43:16 【问题描述】:

想从json格式的dictionary中的string中获取值,在本例中选择key 作为 pp-0 和预期输出 = '1000'

Python 编码

x = 'd': 'AAAAA@##"pp-0": "1000", "pp-1": "1001", "pp-2": "1002", "pp-3": "1003", "pp-4": "1004", "pp-5": "1005", "pp-6": "1006", "pp-7": "1007", "pp-8": "1008", "pp-9": "1009", "pp-10": "1010", "pp-11": "1011", "pp-12": "1012", "pp-13": "1013", "pp-14": "1014", "pp-17": "1015", "pp-27": "1016"'
x['d'].get('pp-0')

错误信息

AttributeError: 'str' object has no attribute 'get'

预期结果

'1000'

【问题讨论】:

json.loads 可以将JSON字符串转换成字典,但是字符串不是JSON格式的。字符串开头有无效数据 【参考方案1】:

这是执行此操作的一种方法。首先访问d 键并删除AAAAA@##。这将产生有效的 JSON,并且可以通过 json 模块反序列化为 python 对象。

>>> tmp = x['d'].removeprefix("AAAAA@##")
>>> # `removeprefix` method added in python 3.9. If you are using python version 
>>> # less than 3.9 you can slice the string instead `x['d'][8:]``
>>> import json
>>> json.loads(tmp).get('pp-0')
'1000'

【讨论】:

亲爱的, strip 和 removeprefix 之间有什么困难?看起来几乎一样 当您使用strip method(例如:'www.example.com'.strip('cmowz.'))时,参数(在这种情况下为cmowz.)不是前缀或后缀;相反,它的值的所有组合都被剥离(结果将是'example.com')。但在removeprefix(prefix) 的情况下,它只会删除prefix 如果字符串以prefix 开头【参考方案2】:

如果jsonified字符串的前缀未知,可以使用re.sub

import json, re
x = 'd': 'AAAAA@##"pp-0": "1000", "pp-1": "1001", "pp-2": "1002", "pp-3": "1003", "pp-4": "1004", "pp-5": "1005", "pp-6": "1006", "pp-7": "1007", "pp-8": "1008", "pp-9": "1009", "pp-10": "1010", "pp-11": "1011", "pp-12": "1012", "pp-13": "1013", "pp-14": "1014", "pp-17": "1015", "pp-27": "1016"'
r = a:json.loads(re.sub('^[^\]+', '', b)) for a, b in x.items()
print(r['d'].get('pp-0'))

输出:

1000

【讨论】:

以上是关于想从字典格式的字符串中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从Django的这个字典字符串中获取值?

从字典数组中获取元素并将键保存为字符串,将值保存为字符串

快速从字典数组中获取无效的 JSON 数组

从字典列表中获取值

无法从 NSUserDefaults 获取字典作为保存格式

从字符串中获取文件名和日期时间