修复非标准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
相关产品推荐
相关产品推荐

