从ADX查询的字符串转numpy数组:寻求更安全的转换方案
替代方案推荐
方案1:用ast.literal_eval替代eval
eval会执行任意代码,风险极高,ast.literal_eval只解析Python合法字面量(列表、数字等),安全性拉满,逻辑和你原来的思路一致:
import numpy as np import ast mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]' # 把字符串改成合法的嵌套列表格式 fixed_str = '[' + mydummystring.replace('][', '],[') + ']' # 安全解析列表 parsed_list = ast.literal_eval(fixed_str) # 转numpy数组 mynumpyarray = np.array(parsed_list)
方案2:正则表达式提取重组
如果字符串格式固定,直接提取所有数值再重组,不用纠结格式修正:
import numpy as np import re mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]' # 提取所有浮点数并转成float nums = list(map(float, re.findall(r'\d+\.\d+', mydummystring))) # 按每组3个元素重组为二维数组 mynumpyarray = np.array(nums).reshape(-1, 3)
要是子数组长度不固定,就先匹配每个[]里的内容再单独处理:
import numpy as np import re mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]' # 抓出每个[]内的内容 sub_arr_strs = re.findall(r'\[(.*?)\]', mydummystring) # 逐个转成float数组再合并 mynumpyarray = np.array([list(map(float, s.split(','))) for s in sub_arr_strs])
方案3:转JSON格式解析
把字符串修正成合法JSON格式,用自带的json模块解析,同样安全可靠:
import numpy as np import json mydummystring = '[1.0,2.0,3.0][4.0,5.0,6.0][6.0,7.0,8.0]' # 修正为合法JSON数组 json_str = '[' + mydummystring.replace('][', '],[') + ']' # 解析JSON parsed_list = json.loads(json_str) # 转numpy数组 mynumpyarray = np.array(parsed_list)
方案选型参考
- 追求简洁安全:优先选
ast.literal_eval或JSON方案,和原逻辑对齐,代码量少。 - 格式复杂/需灵活提取:用正则方案,适配子数组长度不固定、有干扰字符的场景。
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

