You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复非标准JSON格式错误 解析字符串为多类型数据列表

非标准类列表字符串转多类型原生列表方案

不要用全局字符串替换的方式处理这类问题,很容易误改字符串内部的合法字符,导致数据损坏或者解析失败,最稳妥的方案是基于Python原生的字面量解析能力实现,具体处理逻辑如下:

  • 单引号包裹字符串、字典使用数字作为键这两类场景,本身就是Python合法的字面量语法,不需要做替换修改,直接用标准库ast的literal_eval方法即可解析,且能完整保留对应的数据类型,不会把数字键强行转成字符串,也不会因为单引号报错。
  • 针对连续逗号的空元素问题,不要直接全局替换连续逗号,否则会把字符串内容里的连续逗号(比如"a,,b")误改。需要先做定向预处理:仅替换不在引号包裹范围内的连续逗号,将其补全为None占位,同时兼容列表开头、结尾的空元素写法(比如[,1,2,])。
  • 预处理完成后直接调用ast.literal_eval即可完成解析,这个方法不会执行任意代码,安全性远高于直接调用eval,支持解析所有Python原生基础类型的字面量写法,完全满足保留原始数据类型的要求。

可直接复用的实现代码

import ast
import re

def parse_list_str(s: str):
    # 匹配非引号区域内的连续逗号,替换为None占位
    s = re.sub(
        r',(?=,)(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)',
        ',None',
        s
    )
    # 处理列表开头的空元素([ 后直接跟逗号的场景)
    s = re.sub(
        r'\[(?=,)(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)',
        '[None',
        s
    )
    # 处理列表结尾的空元素(] 前直接跟逗号的场景)
    s = re.sub(
        r',(?=\])(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)',
        ',None',
        s
    )
    return ast.literal_eval(s)


# 测试样例
if __name__ == "__main__":
    test_data = "[123,, 'test str with quote: \\'', {1:73,2:32,3:24,4:22,5:19,6:58,7:15,8:127,9:370}, 'contain,,comma']"
    print(parse_list_str(test_data))

上述代码可以正确处理你提到的三类格式问题,同时不会破坏字符串内部的特殊字符,解析后的列表会保留数字、字符串、字典等元素的原始类型,不会出现类型强制转换的问题。

内容的提问来源于stack exchange,提问作者puppet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 00:12:16