2014-12-02 66 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