2016-10-14 60 views
0

我正在解析等式中的數字。從我的代碼沒有什麼問題。 它不能識別等式中的數字1,因爲通常在等式中,數字1被跳過。從x,y,z等式解析數字

def equationSystem(e): 
a = [] 
for s in e: 
    a.append(re.findall("[-]?\d+[\.]?\d*[eE]?[-+]?\d*", s)) 

print a[0] 

例如

equation = ["-x+y+z=0", "x-3y-2z=5", "5x+y+4z=3"] 

預期輸出

[[-1, 1, 1, 0], [1, -1, -2, 5], [5, 1, 4, 3]] 

,但實際產量

[[0], [-2, 5], [5,1,4,3]] 

你能幫助我提高了正則表達式?

+2

您可以在預處理階段添加缺少的1s –

回答

1

假設您改爲尋找已知的常量「xyz =」作爲分隔符,並將它們之間的所有內容作爲正則表達式組使用。

import re 

pattern_string = '([^x]*)x([^y]*)y([^z]*)z=(.+)' 
pattern = re.compile(pattern_string) 

def parse_equation(s): 
    results = pattern.search(s) 
    return results.groups() 

samples = ["-x+y+z=0", "x-3y-2z=5", "5x+y+4z=3"] 
for s in samples: 
    print parse_equation(s) 

輸出是

('-', '+', '+', '0') 
('', '-3', '-2', '5') 
('5', '+', '+4', '3') 

然後你只需要擔心轉換這些字符串爲數字。對於前三個,你知道它們不能爲零,所以它們可能有不同的轉換函數,但這不是必需的。重要的是,如果你沒有在字符串中找到任何數字,那麼你返回+/- 1.因爲你想處理浮點數和電子記數法,所以你需要做更多的事情來做到這一點。剝去空白,但我會留給你。例如,如果有方程「0.5x-36E-4y + z = 0」,那麼在y之前的-36之間的空格將拋出簡單的float(s)轉換。但是,如果你把這個空間,你可以這樣做:

def default_to_one(s): 
    try: 
     coefficient = float(s) 
     return coefficient 
    except: 
     if -1 != s.find('-'): 
      return -1 
     else: 
      return 1 

,並獲得與係數[default_to_one(X)爲X的parse_equation(S)],造成這種輸出你給的三種情況下,再加上一個額外的案例「0.5x -36E-4y + z = 0」來演示如何處理你想要的所有類型,根據你原來的正則表達式。

[-1, 1, 1, 0.0] 
[1, -3.0, -2.0, 5.0] 
[5.0, 1, 4.0, 3.0] 
[0.5, -0.0036, 1, 0.0] 
1

這應該很好地工作:

pat = re.compile(r"(?:(?<=^)|(?<=[+-]))[a-z]") 

這裏的格局pat將有助於1替換所有非數字的前一個字符,如:
-x+y+z=0變得-1+1+1=05x+y+4z=3成爲5x+1+4z=3

for x in equation: 
    s = re.sub(pat, "1", x) # substitute by "1" 
    print (re.findall(r"[-]?\d", s)) # find digits (with signs) 

這給出:

['-1', '1', '1', '0'] 
['1', '-3', '-2', '5'] 
['5', '1', '4', '3'] 
+0

太棒了!我可以建議以另一種方式進行替換:s = re.sub('([ - \ +^=])([a-z])',r'\ g ',x) –

相關問題