我正在使用Sympy的sympify函数来简化2个表达式,因此我可以将它们进行相等比较。
例如:
expr1 = sympify("(2 * x) + (x + 10)")
expr2 = sympify("(x + 10) + (x * 2)")
if expr1 == expr2:
print "Congrats those are essentially the same!"
然而,当使用 2x 形式与 x * 2 相关时,我会得到一个解析异常,例如:
expr1 = sympify("2x + (x + 10)")
有什么方法可以让我们了解 2x 表单吗?
如果没有,是否有其他库可以使用此表单?
答案 0 :(得分:3)
好吧,你可以修改sympy词法分析器(或解析器/语法/其他)。
你也可以用一个为你改变输入字符串的函数来包装它,使用类似这样的东西:
>>> import re
>>> expr = '2x + 1'
>>> re.sub(r"(\d+)(\w+)", r"(\1 * \2)", expr)
'(2 * x) + 1'
但问问自己为什么这个符号不是从那里开始的。
例如,所有这些都是有效的python,虽然已经很长一段时间了,因为我搞惹了同情,但我敢打赌它们除了表示同意之外还有其他意义:
0x32 # hex for 50
5e-3 # 0.005
2j # 2 * sqrt(-1) (so that one *is* multiplication, but by 1j, not j!)
15L # 15 (L used to represent long integers in python)
x2
是什么意思?它是名为x2
的变量还是(x * 2)
。我故意将这个案例从上面的正则表达式中删除,因为它太模糊了。
答案 1 :(得分:1)
SymPy的开发版本能够解析这些表达式。见http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_application。它在sympify
中默认仍未启用,因为sympify
仅对Python语法进行了非常基本的扩展(即包装数字文字和未定义的名称,并将^
转换为{{ 1}})。但是有一个例子说明了如何使用它。
请注意,这也适用于隐式函数应用程序。可能这两个功能应该分开。
编辑:这些功能正在pull request中分开。