如何将大括号包裹的字符串数据转换为Python列表或字典?
解决方法
要把这种非标准格式的数据集转换成Python可直接使用的列表,核心思路是先将文本格式修正为Python能识别的语法,再用ast.literal_eval()解析(比eval()更安全)。具体步骤如下:
步骤1:格式修正
先对原始文本做三次替换,把非Python语法的结构转成合法结构:
- 把所有大括号
{}替换成列表用的方括号[] - 把范围格式
..替换成Python列表的逗号分隔符, - 把单独的
*替换成带引号的字符串'*'
步骤2:给字符串自动加引号
用正则表达式匹配所有非纯数字的字符序列(比如0-0:14.0.1.255),自动给它们加上单引号,确保符合Python字符串语法。
完整代码实现
import re import ast # 原始数据 raw_data = """{{1,{{1,6,0-0:14.0.1.255,4,*},{1,6,0-0:14.0.2.255,4,*},{2,70,0-1:96.3.10.255,[1..2],0}}},{2,{{1,6,0-0:14.0.1.255,4,*},{1,6,0-0:14.0.2.255,4,*},{2,70,0-1:96.3.10.255,[1..2],0}}},{3,{{1,6,0-0:14.0.1.255,4,*},{1,6,0-0:14.0.2.255,4,*},{2,70,0-1:96.3.10.255,[1..2],0}}},{4,{{1,6,0-0:14.0.1.255,4,*},{1,6,0-0:14.0.2.255,4,*},{2,70,0-1:96.3.10.255,[1..2],0}}}}""" # 步骤1:替换非Python语法结构 processed = raw_data.replace('{', '[').replace('}', ']') processed = processed.replace('..', ', ') processed = processed.replace('*', "'*'") # 步骤2:给非数字字符串加引号 def quote_non_numbers(match): text = match.group(0) return text if text.isdigit() else f"'{text}'" processed = re.sub(r'[a-zA-Z0-9\-:\.]+', quote_non_numbers, processed) # 步骤3:解析为Python列表 python_list = ast.literal_eval(processed) # 验证结果 print(python_list[0])
说明
- 这段代码会把原始数据转换成嵌套的Python列表,其中字符串类型的元素(比如
0-0:14.0.1.255、*)都被正确包裹引号,数字保持原样,[1..2]被转成[1, 2]。 - 如果需要转换成字典,可以在解析后进一步处理,比如把每个顶层元素(比如
[1, [...]])转成{1: [...]}的结构。
内容的提问来源于stack exchange,提问作者YoloCast
相关产品推荐
相关产品推荐

