我需要一个从字符串中生成列表的方法,如下所示:
"( * 1 2 ( - 4 3 ) )" -> ["*", 1, 2, ["-", 4, 3]]
有没有简单的方法来处理这个问题?
答案 0 :(得分:3)
有些事情是这样的:
a = " ( * 1 2 ( - 4 35 ) ( + 100 ( / 1 2 ) ) ( + 100 200 ) )"
def p(s):
r = []
for x in s:
if x == "(":
r.append( p(s) )
elif x == ")":
return r
else:
r.append(x)
return r
p(iter(a.split()))
输出是:
缺货[23]:
[['*',
'1',
'2',
['-', '4', '35'],
['+', '100', ['/', '1', '2']],
['+', '100', '200']]]
您需要添加一些代码才能将字符串转换为数字。
答案 1 :(得分:3)
使用pyparsing,例如:
from pyparsing import *
enclosed = Forward()
nestedParens = nestedExpr('(', ')', content=enclosed)
integer = Word( nums ) # simple unsigned integer
arithOp = Word( "+-*/", max=1 ) # arithmetic operators
enclosed << ( nestedParens | arithOp | integer )
data = '( * 1 2 ( - 4 3 ) )'
print enclosed.parseString(data).asList()
输出:
$ python parse.py
[['*', '1', '2', ['-', '4', '3']]]
答案 2 :(得分:2)
没有简单的内置调用或可以使用的单线技巧,但它仍然完全可以管理。
首先,您需要标记输入。粗略地说,这意味着将其分为(
,*
和123
等单位。如果您的输入保证以空格分隔,则可以使用split
方法,但如果您需要处理(* (+ 1 2) 3)
之类的输入,则可能会有点困难。
>>> "( * 1 2 ( - 4 3 ) )".split()
['(', '*', '1', '2', '(', '-', '4', '3', ')', ')']
既然你有一系列令牌,我们就可以编写一个递归解析器。一次过一个令牌。
int
或float
并返回结果。