首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串表达式转换为数学表达式?

将字符串表达式转换为数学表达式?
EN

Stack Overflow用户
提问于 2016-09-30 23:13:01
回答 2查看 2.1K关注 0票数 2

我正在寻找一些东西,将一个数学表达式字符串作为输入,并通过添加括号来改变它。

例如:

输入1:"2*4^7"

输出1:"(2*(4^7))"

输入2:"sin(x)*3-8^9"

输出2:"((sin(x)*3)-(8^9))"

输入3:"(2-8)/6"

输出3:"((2-8)/6)"

我目前正在尝试对它进行编码,但是它花费了太多的时间,我更愿意专注于其他事情,所以如果你们知道一些模块可以这样做的话,那就太好了。

我在用python 3

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-30 23:36:56

使用ast模块,您可以解析您的字符串,然后遍历它来构建所需的字符串表示:

代码语言:javascript
复制
import ast

def represent(tree):
    t = type(tree)
    if t == ast.Module:
        return represent(tree.body)
    elif t == list:
        # arithmetic expression should only be one thing
        return ", ".join(represent(part) for part in tree)
    elif t == ast.Expr:
        return represent(tree.value)
    elif t == ast.BinOp:
        o = type(tree.op)
        if o == ast.BitXor:
            op = "^"
        elif o == ast.Mult:
            op = "*"
        elif o == ast.Add:
            op = "+"
        ...
        return "({}{}{})".format(
                represent(tree.left),
                op,
                represent(tree.right),
                )
    elif t == ast.Num:
        return str(tree.n)
    elif t == ast.Name:
        return tree.id
    elif t == ast.Call:
        return "{}({})".format(
                represent(tree.func),
                represent(tree.args),
                )
    ...

# prints (((sin(x)*2)*x)+4)
print(represent(ast.parse("sin(x)*2*x+4")))

正如@user2357112在注释中所指出的,只有当您限制自己使用Python的表达式语法,最重要的是使用**而不是^进行幂运算时,这才能起作用。

票数 2
EN

Stack Overflow用户

发布于 2022-06-22 07:00:58

只需使用eval(expression)

b=a.replace('^','**')eval(b)替换eval(b)中的字符

可以使用一些变量

例:

代码语言:javascript
复制
x= 3
eval("3 * x **2")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39801324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档