从字符串中提取列表

时间:2018-04-18 03:12:38

标签: python python-2.7

我正在使用python并面临问题从具有该列表的字符串中提取特定列表对象。

这是我在字符串中的列表对象。

input = "[[1,2,3],[c,4,r]]"

我需要这样的输出。

output = [[1,2,3],[c,4,r]]

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:1)

使用ast.literal_eval

Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.8.2] on linux
   import ast
   input = "[[1,2,3],['c',4,'r']]"
   output = ast.literal_eval(input)
   output
=> [[1, 2, 3], ['c', 4, 'r']]

如果您实际上意味着cr只是变量cr的当前值,而不是文字'c'和{ {1}},您需要使用相当不安全的'r',但其他方式也一样。

答案 1 :(得分:0)

如果ast.literal_eval不够,cr是应该解释的非平凡数据对象,您可以考虑使用asteval({{ 3}})。它可以处理超出文字字符串的python字符串,包括它自己的符号表,并避免使用eval()的许多已知漏洞。

asteval就像一个带有简单平面命名空间的沙盒迷你解释器。您必须将cr的值添加到asteval解释器,但示例可能是:

from asteval import Interpreter
aeval = Interpreter()
aeval('c = 299792458.0')   # speed of light?
aeval('r = c/(2*pi)')      # radius of a circle of circumference c?
                           # note that pi and many other numpy
                           # symbols and functions are built in
input_string = "[[1,2,3],[c,4,r]]"

out = aeval(input_string)
print(out)

将给出

[[1, 2, 3], [299792458.0, 4, 47713451.59236942]]

或者,您可以使用

直接从Python设置c
aeval.symtable['c'] = 299792458.0

asteval拒绝做许多已知的不安全事情,但ast.literal_eval也不能做许多事情。当然,如果你接受用户输入的代码,你应该非常小心。

答案 2 :(得分:-1)

使用ast模块literal_eval方法获得更安全的评估

import ast
input = "[[1,2,3],['c',4,'r']]"
output= ast.literal_eval(input)
print(output)
#[[1, 2, 3], ['c', 4, 'r']]

此代码在Python 3.6中进行了测试。它甚至可以在2.7中工作。

答案 3 :(得分:-1)

永远不要将输入用作变量名,它是python中的关键字:

你可以使用numpy:

import numpy as np

user_input = "[[1,2,3],[c,4,r]]"

print(np.array(user_input))

输出:

[[1,2,3],[c,4,r]]