這裏是一個正則表達式的解決方案:
import re
def evaluatesimple(s):
return eval(s)
def evaluate(s):
while 1:
simplesums=re.findall("\[([^\]\[]*)\]",s)
if (len(simplesums) == 0):
break
replacements=[('[%s]' % item,str(evaluatesimple(item))) for item in simplesums]
for r in replacements:
s = s.replace(*r)
return s
print evaluate("[9+[7*3+[1+2]]-5]")
但是,如果你想要去整個生豬和構建一棵樹後評估,您可以使用相同的技術,但表情和子表達式存儲在字典:
def tokengen():
for c in 'abcdefghijklmnopqrstuvwyxz':
yield c
def makeexpressiontree(s):
d=dict()
tokens = tokengen()
while 1:
simplesums=re.findall("\[([^\]\[]*)\]",s)
if (len(simplesums) == 0):
break
for item in simplesums:
t = tokens.next()
d[t] = item
s = s.replace("[%s]"% item,t)
return d
def evaltree(d):
"""A simple dumb way to show in principle how to evaluate the tree"""
result=0
ev={}
for i,t in zip(range(len(d)),tokengen()):
ev[t] = eval(d[t],ev)
result = ev[t]
return result
s="[9+[7*3+[1+2]]-5]"
print evaluate(s)
tree=makeexpressiontree(s)
print tree
print evaltree(tree)
(編輯延長我的答案)
如果您不需要的中間值,一個簡單的查找/替換,輪流支架插入括號,其次是一個eval,將正常工作。 – Triptych 2012-02-06 14:58:19
我沒有看到英語的重大問題。 (不重要的問題包括小寫專有名詞和不以問號結束的問題。)我無法直接回答您的問題,但我建議您搜索*解析工具*。 (Python解析工具,如果你喜歡,但你的例子不是特定於Python。) – kojiro 2012-02-06 15:02:01
做一個快速評估,你可以簡單地做:'eval(exampleString.replace('[','(').replace(' ]',')'))' – juliomalegria 2012-02-06 15:05:27