Python 检测数学表达式中的缺失乘法
给出一个表达式,如Python 检测数学表达式中的缺失乘法,python,regex,wolfram-mathematica,symbolic-math,Python,Regex,Wolfram Mathematica,Symbolic Math,给出一个表达式,如 (exp(-((-mx + x - y)^2/(2 s1^2))2x - 2y (-my + y)^2/(2 s2^2)))/(2 pi sqrt(s1^2) sqrt(s2^2) 在发生乘法的地方,检测所有乘法的简单方法是什么?上述表达式是唯一定义的。变量不能以数字开头,两个变量相乘后总是用空格隔开 即,可以使用什么正则表达式(或其他方法)将上述内容转换为 (exp(-((-mx + x - y)^2/(2*s1^2))*2*x - 2*y*(-my + y)^2/(2*
(exp(-((-mx + x - y)^2/(2 s1^2))2x - 2y (-my + y)^2/(2 s2^2)))/(2
pi sqrt(s1^2) sqrt(s2^2)
在发生乘法的地方,检测所有乘法的简单方法是什么?上述表达式是唯一定义的。变量不能以数字开头,两个变量相乘后总是用空格隔开
即,可以使用什么正则表达式(或其他方法)将上述内容转换为
(exp(-((-mx + x - y)^2/(2*s1^2))*2*x - 2*y*(-my + y)^2/(2*s2^2)))/(2*
pi*sqrt(s1^2)*sqrt(s2^2)
首选Python或正则表达式解决方案。首先,您应该清楚地定义何时插入
*
以及何时不插入的情况,以避免更改,例如,exp(
到e*x*p*(
)现在,创建一些与这些情况匹配的正则表达式
patterns = [r"([0-9])\s*([a-z(])", # matches '2x', '2 x', or '2 ('
r"([a-z])\s+([a-z])", # matches 'x y', but not 'xy'
r"([a-z])\s+(\()", # matches 'x (', but not 'x('
r"(\))\s*([0-9a-z(])"] # matches ')x', ')2', ') x', ') (', etc.
使用re.findall
测试这些。最后,您必须在表达式中替换这些模式。您可以使用re.sub
替换r“\1*\2”
。这里,\1
和\2
是模式中匹配的组
expr = "(exp(-((-mx + x - y)^2/(2 s1^2))2x - 2y (-my + y)^2/(2 s2^2)))/(2pi sqrt(s1^2) sqrt(s2^2)"
for p in patterns:
expr = re.sub(p, r"\1*\2", expr)
之后,expr
看起来很像您问题中的示例:
(exp(-((-mx + x - y)^2/(2*s1^2))*2*x - 2*y*(-my + y)^2/(2*s2^2)))/(2*pi*sqrt(s1^2)*sqrt(s2^2)
如何区分例如
exp(
和y(
)?啊,对了。对不起。应该有一个空格。谢谢。您当前的正则表达式在哪里,它到底有什么问题?非常感谢!我不得不添加这些行,但现在它可以工作了。expr=expr.replace(“”),“,”)*(“)expr=re.sub(“([0-9”(())”,insert_mult,expr)#2(@Julius I将这些案例添加到第一个和第四个模式中。