[英]A list of lists from string in Python
我需要一個方法,從下面的字符串生成一個列表:
"( * 1 2 ( - 4 3 ) )" -> ["*", 1, 2, ["-", 4, 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']]]
您需要添加一些代碼才能將字符串轉換為數字。
使用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']]]
沒有簡單的內置調用或可以使用的單線技巧,但它仍然完全可以管理。
首先,您需要標記輸入。 粗略地說,這意味着將它分成像(
, *
和123
這樣的單位。如果你的輸入保證是空格分隔的,你可以使用split
方法,但是如果你需要處理像(* (+ 1 2) 3)
這樣的輸入(* (+ 1 2) 3)
,它可能有點難。
>>> "( * 1 2 ( - 4 3 ) )".split()
['(', '*', '1', '2', '(', '-', '4', '3', ')', ')']
既然你有一系列令牌,我們就可以編寫一個遞歸解析器。 一次過一個令牌。
int
或float
並返回結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.