检测数学表达式中缺少的乘法

时间:2014-12-02 11:55:18

标签: 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*s2^2)))/(2*
pi*sqrt(s1^2)*sqrt(s2^2)

首选Python或正则表达式解决方案。

1 个答案:

答案 0 :(得分:1)

首先,您应该清楚地定义何时插入*以及何时不插入,以避免更改,例如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)