评估字符串内的数学表达式
我有一个关于字符串内数学表达式评估的问题。 例如我的字符串如下:
my_str='I have 6 * (2 + 3) apples'
我想知道如何评估这个字符串,并得到以下结果:
'I have 30 apples'
有没有办法做到这一点?
提前致谢。
PS python的eval
函数在这种情况下不起作用。 当尝试使用eval
函数进行评估时,它引发了一个错误。
这是我的尝试:
>>> import string
>>> s = 'I have 6 * (2+3) apples'
>>> symbols = '^*()/+-'
>>> formula = [(x,s.index(x)) for x in s if x in string.digits+symbols]
>>> result = eval(''.join(x[0] for x in formula), {'__builtins__':None})
>>> s = s[:formula[0][1]] + str(result) + s[formula[-1][1]+1:]
>>> s
'I have 30 apples'
笔记:
这很简单,它不会处理复数方程 - 就像那些有平方根,pi等等的方程,但我相信它符合问题之后的精神。 对于一个非常健全的答案,请参阅jeffery_the_wind发布的问题; 但我认为对于这个过于简单的案例来说可能是过分的。
有时候最好简化问题而不是提出复杂的解决方案。 您可能希望通过像这样提供代码来简化问题
my_str='I have {6 * (2 + 3)} apples'
这样你可以使用一个简单的正则表达式来解析它,并且评估里面的内容。 否则,你会遇到很多复杂问题。
感谢大家的帮助。 实际上,我提供的例子非常简单,它比较了我在实际任务中的情况。 我从文件中读取这些字符串,有时可以像这样查看:
my_str='ENC M6_finger_VNCAPa (AA SYZE BY (0.14*2)) < (0.12 + 0.07) OPPOSITE REGION'
数学方程很简单,但可以在一个字符串中出现很多时间,并应单独评估。
所以我写了一个示例代码,它能够处理这种情况:也许它不是很好,但解决了这个问题:
def eval_math_expressions(filelist):
for line in filelist:
if re.match('.*[-|+|*|/].*',line):
lindex=int(filelist.index(line))
line_list=line.split()
exp=[]
for word in line_list:
if re.match('^(+d+',word) or re.match('^[)+|d+|-|+|*|/]',word):
exp.append(word)
else:
ready=' '.join(exp)
if ready:
eval_ready=str(eval(ready))
line_new=line.replace(ready,eval_ready)
line=line_new
filelist[lindex]=line
exp=[]
return filelist
链接地址: http://www.djcxy.com/p/63077.html
上一篇: Evaluate math expression within string
下一篇: javascript interactive debugging (equivalent of python's pdb.set