在Python中拆分字符串并转换为JSON

0 投票
1 回答
1249 浏览
提问于 2025-04-18 21:55

我有一个这样的字符串:

{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]

我只需要在["eq('2'....之前的所有内容,所以我只需要保存 {'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}。我不能使用索引,因为长度每次都可能不同,所以我必须以某种方式检查"["。有没有什么方法可以在Python中做到这一点,然后把结果转换成JSON格式?我对Python还很陌生,所以希望能得到一些帮助。

1 个回答

1

如果格式真的这么具体,那就简单多了:只需要在 [ 处进行分割,因为在 {…} 里面没有 [ 的部分。所以:

>>> s = """{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]"""
>>> sd, _, sl = s.partition('[')
>>> sl = '[' + sl

现在,假设你并不想把这个 字符串 转换成 JSON,而是想把这个字符串所代表的 字典 转换成 JSON。要做到这一点,你需要用 eval 来处理它。因为你只有一些显示的字面量,所以可以使用安全的 ast.literal_eval 函数来完成这个操作。所以:

>>> import ast
>>> d = ast.literal_eval(sd)
>>> sd
"{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}"
>>> d
{'2': {1, 2}, '4': {1, 2}, '0': {1, 2}}

不过,你仍然不能把它转成 JSON,因为 {1, 2} 是一个集合,而 JSON 不支持集合。你需要决定把它转换成什么。是数组?一个值为 None 的字典?还是其他什么东西?


要把所有的集合转换成列表(可以被表示为 JSON 数组),你有两个选择。

第一个是创建一个 JSONEncoder 的子类。在 文档 的开头有一个很好的例子,展示了如何把 complex 值编码成两个元素的列表,你可以很容易地调整这个例子:只需把 complex 改成 set,把 [o.real, o.imag] 改成 list(o)

第二个选择是预处理数据。就像最开始解析一样,这个过程的难易程度取决于你的格式有多严格。如果字典的所有顶层值都是集合,而其他的都不是集合,那么只需用 {k: list(v) for k, v in sd.items()} 就可以了。另一方面,如果你有一个任意的字典,里面递归地包含集合、字符串、数字、字典和列表,那么你可能需要写一个递归函数来进行转换。


与此同时……你是从哪里得到这些数据的?我猜测你可能在代码的其他部分只是打印了一个字典(或者用 f.write 写了一个字典的 str()…)后面跟着一个列表。如果是这样的话,不如直接修改你的代码,先写出 JSON(或者其他可解析的格式)。


如果你的格式稍微复杂一点——比如字典里面可能有列表——你就需要做一些更复杂的处理。例如,你可以计算打开的花括号减去关闭的花括号,继续这个过程直到回到 0,这样就能得到字典了。

撰写回答