Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字符串表达式转换为数学表达式?_Python_String_Python 3.x - Fatal编程技术网

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

Python 将字符串表达式转换为数学表达式?,python,string,python-3.x,Python,String,Python 3.x,我正在寻找一种可以将数学表达式字符串作为输入,并通过添加括号对其进行更改的方法 例如: 输入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 谢谢大家! 使用ast模块,您可以解析字符串,然后遍历它

我正在寻找一种可以将数学表达式字符串作为输入,并通过添加括号对其进行更改的方法

例如:

输入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


谢谢大家!

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

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的表达式语法时,这才有效,最重要的是使用
**
而不是
^
进行幂运算

尝试
ast
模块。+1用于
ast
。抽象语法树,我想?基本上,你必须为一个数学表达式定义一种“语言”(或“语法”),然后你可以得到一个包,给你一个解析器,将表达式转换成一棵树,公式的各个元素就是节点。@Lagerber不需要定义语言,Python已经定义好了。他们可以对字符串执行
ast.parse
,然后遍历生成的树。思维太复杂。@L3viathan:ast模块用于Python语法,而此语法不是Python。对于一个明显的不兼容,
^
表示不同的含义,它具有不同的优先级。最好有一个真正的解析器生成器,而不是使用Python解析器。哇,这给我留下了深刻的印象。我几乎完成了自己的编码,没有任何模块,但我发现你的解决方法更有用。但是,如何实现自定义表达式。例如,我想实现如下向量synax:[xyz]和如下矩阵语法{abc;def;ghi}。所以k*[xyz]+[abc]看起来像((k*[xyz]+[abc])是的,这就是为什么我在结尾添加了一行关于注意事项的内容:使用这个解决方案,您将无法做到这一点(除了一些老套的方法,比如在解析字符串之前转换字符串)。在这种情况下,我的解决方案对你没有帮助。看一看,好的,我会检查一下。谢谢你的帮助@比亚坦。另外,我将把[xyz]改为vector(x,y,z),这与您的代码配合得很好。