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将这些案例添加到第一个和第四个模式中。