7

I'm using Sympy's sympify function to simplify 2 expressions so I can compare them for equality.

For example:

expr1 = sympify("(2 * x) + (x + 10)")
expr2 = sympify("(x + 10) + (x * 2)")

if expr1 == expr2:
   print "Congrats those are essentially the same!"

However when using the form 2x as apposed to x*2 i get a parse exception eg:

expr1 = sympify("2x + (x + 10)")

Is there any way I can get sympy to understand the 2x form ?

If not, is there any other library that will allow this form ?

4

2 回答 2

3

好吧,您可以修改 sympy 词法分析器(或解析器/语法/其他)。

你也可以用一个为你转换输入字符串的函数来包装它,使用类似这样的东西:

>>> import re
>>> expr = '2x + 1'
>>> re.sub(r"(\d+)(\w+)", r"(\1 * \2)", expr)
'(2 * x) + 1'

但是问问自己,为什么一开始就没有这个符号。

例如,所有这些都是有效的 python,虽然我已经很长时间没有弄乱 sympy 了,但我敢打赌,除了 sympy 中的乘法之外,它们还有其他含义:

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)。我故意将这种情况排除在上面的正则表达式之外,因为它太模棱两可了。

于 2011-02-23T01:06:42.837 回答
2

SymPy 的开发版本具有解析此类表达式的能力。请参阅http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_application。默认情况下它仍然没有在 中启用sympify,因为sympify它只对 Python 语法进行了非常基本的扩展(即,包装数字文字和未定义的名称,并转换^**)。但是那里有一个例子展示了如何使用它。

请注意,这目前也适用于隐式函数应用程序。可能这两个功能应该分开。

编辑:这些功能被拆分为pull request

于 2013-03-03T22:02:19.617 回答