Php 将AsciiMath解析为Python表达式
我试图通过JSON将两个函数传递给python脚本,以评估它们的等价性。我遇到的问题是输入是用符号表示的。如果格式与Python表达式的格式一致,那么从字符串解析表达式似乎没有问题。有没有办法将ascimath符号解析成Python可以解释的东西?我一直找不到任何提供这种功能的库 PHP: Python:Php 将AsciiMath解析为Python表达式,php,python,sympy,mathjax,asciimath,Php,Python,Sympy,Mathjax,Asciimath,我试图通过JSON将两个函数传递给python脚本,以评估它们的等价性。我遇到的问题是输入是用符号表示的。如果格式与Python表达式的格式一致,那么从字符串解析表达式似乎没有问题。有没有办法将ascimath符号解析成Python可以解释的东西?我一直找不到任何提供这种功能的库 PHP: Python: import sys, json from sympy import * # Load the json data sent from PHP try: data = json.lo
import sys, json
from sympy import *
# Load the json data sent from PHP
try:
data = json.loads(sys.argv[1])
except:
sys.exit(1)
x = Symbol('x')
# Convert string inputs to expressions
user_response = sympify(data[0])
correct_answer = sympify(data[1])
# Perform equivalence comparison
result = user_response == correct_answer
# Return result
print json.dumps(result)
当你问这样的问题时,你应该证明这个问题。以下是我认为正在发生的事情 对于一组表达式,
sympify
可以正常工作:
In [144]: sympify('2*x')==sympify('x*2')
Out[144]: True
但对于另一对:
In [145]: sympify('2x')==sympify('x2')
---------------------------------------------------------------------------
SyntaxError Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/sympy/core/sympify.py in sympify(a, locals, convert_xor, strict, rational, evaluate)
367 a = a.replace('\n', '')
--> 368 expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate)
369 except (TokenError, SyntaxError) as exc:
...
SympifyError: Sympify of expression 'could not parse '2x'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
sympify
需要可以在sympy
环境中计算的字符串
将任意表达式转换为可在Symphy中使用的类型
它说的是任意的,但文档的限制性更强,如前所述
It currently accepts as arguments:
- any object defined in sympy
- standard numeric python types: int, long, float, Decimal
- strings (like "0.09" or "2e-19")
- booleans, including ``None`` (will leave ``None`` unchanged)
- lists, sets or tuples containing any of the above
在问题的上下文中,表示使用x
的表达式,其定义为
x = Symbol('x')
但是那些使用y
的会有问题
===
sympify
生成一个sympy
表达式:
In [161]: expr = sympify('2*x')
In [162]: type(expr)
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')
In [167]: expr = sympify('2*y')
In [168]: expr
Out[168]: 2⋅y
In [171]: 2*y
Out[171]: 42
In [172]: 2*x
Out[172]: 2⋅x
然后可以通过各种方式对其进行“评估”。我可以将其描述为“修改的”,但sympy
强调表达式是不可变的。这些操作都会生成新的表达式或值:
In [163]: expr.subs(x,21)
Out[163]: 42
In [164]: expr.diff(x)
Out[164]: 2
In [165]: expr.integrate(x)
Out[165]:
2
x
===
而且,核心Python解释器无法对此类表达式求值
定义新符号和表达式:
In [161]: expr = sympify('2*x')
In [162]: type(expr)
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')
In [167]: expr = sympify('2*y')
In [168]: expr
Out[168]: 2⋅y
In [171]: 2*y
Out[171]: 42
In [172]: 2*x
Out[172]: 2⋅x
将y
重新指定为Python整数不会更改expr
的值:
In [169]: y = 21
In [170]: expr
Out[170]: 2⋅y
但它确实允许我们计算一个正则Python表达式:
In [161]: expr = sympify('2*x')
In [162]: type(expr)
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')
In [167]: expr = sympify('2*y')
In [168]: expr
Out[168]: 2⋅y
In [171]: 2*y
Out[171]: 42
In [172]: 2*x
Out[172]: 2⋅x
但是使用x
符号的相同Python表达式会生成sympy
表达式:
In [161]: expr = sympify('2*x')
In [162]: type(expr)
Out[162]: sympy.core.mul.Mul
In [166]: y = Symbol('y')
In [167]: expr = sympify('2*y')
In [168]: expr
Out[168]: 2⋅y
In [171]: 2*y
Out[171]: 42
In [172]: 2*x
Out[172]: 2⋅x
===
这个解析
模块具有处理诸如“2x”之类的表达式的方法。至少文件显示:
(同样在isympy
会话中):
因此,它确实可以处理您的示例,但我对ascimatch
了解不够,不知道还有多少其他功能
该页面还讨论了一个
LaTeX
parser,什么是“ASCII数学符号”@user2357112请看:这里有一个python库可以解析AsciiMath:我在谷歌找到它,你尝试了什么?那是AsciiMath,不是“ASCII数学符号”或“ASCII符号”。@user2357112明白了。我已经改正了语言。谢谢你的帮助。你是对的,上面的例子正是问题所在,从这里我们将如何处理这个问题?我已经研究了几天,几乎没有机会想出一个前进的策略。非常感谢您的全面回复。您提供了极好的上下文和示例。我认为这里有足够的东西让我继续前进,尝试不同的输入。