将格式化的字符串转换为字典

时间:2018-07-31 21:33:07

标签: string python-3.x

我知道那里有很多类似的问题,例如:

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字典。我包含的链接为我提供了一个空洞的例子。

1 个答案:

答案 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)

要使这个真正的通用目的,您可能必须添加一些其他的错误检查,但是通过示例,我希望可以成功。

相关问题