2014-12-02 86 views
-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) 

的是一个简单的方法来检测所有地方发生多次这样的表达式?上面的表达式是唯一定义的。变量不能以数字开头,并且多个变量总是以空格分隔。

I.e.什么正则表达式(或其他方法)可用于将上述内容转换为

(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或正则表达式解决方案将是首选。

+0

如何区分例如'exp('from'y('? – 2014-12-02 11:57:27

+0

啊,对不对,应该有一个空格,谢谢 – Julius 2014-12-02 11:58:56

+1

你现在的正则表达式在哪里,到底是什么问题? – jonrsharpe 2014-12-02 12:04:44

回答

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) 
+0

非常感谢你! ('',')*(') expr = re.sub(“','') expr = expr.replace('','') expr = expr.replace ([0-9])(\()“,insert_mult,expr)#2( – Julius 2014-12-02 13:53:32

+1

@Julius我将这些案例添加到第一个和第四个模式。 – 2014-12-02 14:00:12