评估字符串内的数学表达式

我有一个关于字符串内数学表达式评估的问题。 例如我的字符串如下:

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