我知道那里有很多类似的问题,例如:
Simple way to convert a string to a dictionary
但是,我正在尝试不使用正则表达式的情况。
例如,我知道我可以做到
string = "abc=123,xyz=456"
dict(x.split('=') for x in string.split(','))
提供:
{'xyz': '456', 'abc': '123'}
我正在尝试对嵌套词典执行此操作。而且我更喜欢尽量避免使用正则表达式。
我有一个示例字符串:
"{ currNode = {currIndex = 23, currElem = 0x0}, size = 23}"
代码应将其转换为
{ 'currNode': { 'currIndex':'23', 'currElem':'0x0'}, 'size':'23' }
基本上是嵌套的python字典。我包含的链接为我提供了一个空洞的例子。
答案 0 :(得分:1)
有一个JSON库,该库已经提供了将字符串加载到字典的基本功能。拥有将输入字符串转换为JSON,然后使用库函数加载它的字符串格式化函数似乎非常简单。鉴于此,这应该起作用吗?
import json
import string
from pprint import pprint
def convert(input_string):
""" Given an input string, convert to JSON and load to dict"""
token_characters = string.ascii_letters + string.digits
json_str = str()
token_marker = False
for index, char in enumerate(input_string):
if char == "=":
json_str += ":"
elif char in token_characters and not token_marker:
token_marker = True
json_str += '"%s' % char
elif char not in token_characters and token_marker:
token_marker = False
json_str += '"%s' % char
else:
json_str += char
return json.loads(json_str)
if __name__ == "__main__":
a = "{ currNode = {currIndex = 23, currElem = 0x0}, size = 23}"
pprint(convert(a))
这基本上只是解析字符串,寻找可能是键或值(或代码中的标记)的字符,然后用引号将它们制成与JSON兼容的字符串。但是,您必须正确定义令牌字符才能正常工作。
理论上,您可以将其更改为具有相反的逻辑,在此逻辑中,您将除“ {,=}”以外的所有内容都视为标记字符。决定因素将取决于您是否具有一致的分隔符或字符(或者编写的测试次数最少)。后一种方法似乎更好,但这是逻辑翻转版本的示例:
def convert2(input_string):
""" given an input string, convert to JSON and load"""
not_token_characters = "{=,: }"
json_str = str()
token_marker = False
for index, char in enumerate(input_string):
if char == "=":
json_str += ":"
elif char not in not_token_characters and not token_marker:
token_marker = True
json_str += '"%s' % char
elif char in not_token_characters and token_marker:
token_marker = False
json_str += '"%s' % char
else:
json_str += char
return json.loads(json_str)
要使这个真正的通用目的,您可能必须添加一些其他的错误检查,但是通过示例,我希望可以成功。