【问题标题】:Convert a formatted string to a dictionary将格式化字符串转换为字典
【发布时间】:2019-01-08 09:11:34
【问题描述】:

我知道有很多类似的问题,比如:

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 字典。我所包含的链接为我提供了一个空字典,用于此类示例。

【问题讨论】:

  • 你可以把它放在一个函数中,然后检查正则表达式给出的值是否包含{}s。如果是这样,则通过将值传递回函数来进行递归。这个问题叫递归。不过,可能已经有一个内置的解析器可以解决这个问题。
  • 这基本上是“gdb”打印数据的方式。你会碰巧知道一个内置的解析器吗?
  • 不,老实说,我不经常使用 Python。我只是评论,因为你没有得到其他帮助。对不起。
  • 啊,没关系。在写递归函数的作品中。我可能会自己把它作为答案。

标签: string python-3.x


【解决方案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)

要实现这个真正通用的目的,您可能必须添加一些额外的错误检查,但我希望这应该可以帮助您进行示例。

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 2018-04-25
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多