2015-12-20 19 views
0

您好體驗pythoners。解析包含多項式的輸入文件

目標僅僅是閱讀我自己的具有以下格式的文件,然後對這些值和多項式應用數學運算。這些文件具有以下格式:

m1:=10: 
m2:=30: 
Z1:=1: 
Z2:=-1: 
... 
Some very similar variables, next come the laguerre polynomials 
... 
F:= (12.58295)*L(0,x)*L(1,y)*L(6,z) + (30.19372)*L(0,x)*L(2,y)*L(2,z) - ...: 

其中,L代表laguerre多項式並帶有兩個參數。

我已經寫了一個Python程序,它將每一行分成左右兩側,使用「=」字符作爲分隔符。這些文件的格式總是相同的,但F中laguerre多項式的數量可能會有所不同。

import re 
linestring = open("file.txt", "r").read() 
linestring = re.sub("\n\n","\n",str(linestring)) 
linestring = re.sub(",\n",",",linestring) 
linestring = re.sub("\\+\n","+",linestring) 
linestring = re.sub(":=\n",":=",linestring) 
linestring = re.sub(":\n","\n",linestring) 
linestring = re.sub(":","",linestring) 
LINES = linestring.split("\n") 
for LINE in LINES: 
    LINE = re.sub(" ","",LINE) 
    print "LINE=", LINE 
    if len(LINE) <=0: 
     next 
    PAIR = LINE.split("=") 
    print "PAIR=", PAIR 
    LHS = PAIR[0] 
    RHS = PAIR[1] 
    print "LHS=", LHS 
    print "RHS=", RHS 

第一個re.sub塊只處理格式化文件並丟棄python無法處理的字符;然後執行一個循環來打印4件東西,LINE,PAIR,LHS和RHS,它很好地完成了這項工作。使用示例文件從程序上面會打印以下:

LINE= m1=1 
PAIR= ['m1', '1'] 
LHS= m1 
RHS= 1 

LINE= m2=1 
PAIR= ['m2', '1'] 
LHS= m2 
RHS= 1 

LINE= Z1=-1 
PAIR= ['Z1', '-1'] 
LHS= Z1 
RHS= -1 

LINE= Z2=-1 
PAIR= ['Z2', '-1'] 
LHS= Z2 
RHS= -1 

LINE= F= 12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z) 
PAIR=['F', '12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z)'] 
LHS= F 
RHS= 12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z) 

我的問題是什麼是處理此輸出,並用它在數學腳本,特別是分配L到平均拉蓋爾多項式的下一個最好的一步?我嘗試將LHS和RHS放入字典中,但由於laguerre多項式,發現將F放在其中是很麻煩的。

歡迎任何想法。也許我過於複雜,並且有一種更簡單的方法來解析這個文件。

提前感謝

回答

0

你的分析算法似乎並沒有正常工作,因爲你的變量RHS不產生預期的結果。 也想要格式化文件的第一個re.sub塊看起來過於複雜。假設在你輸入文件中的每個語句由一個冒號終止,你可以擺脫所有的空格和換行,並使用下面的代碼單獨的語句:

linestring = open('file.txt','r').read() 
strippedstring = linestring.replace('\n','').replace(' ','') 
statements = re.split(':(?!=)',strippedstring)[:-1] 

然後你遍歷報表和LHS分割每一個和RHS:

for st in statements: 
    lhs,rhs = re.split(':=',st) 
    print 'lhs=',lhs 
    print 'rhs=',rhs 

在接下來的步驟,嘗試區分正常浮動變量和多項式:

#evaluate rhs 
    try: 
     #interpret as numeric constant 
     f = float(rhs) 
     print " ",f 
    except ValueError: 
     #interpret as laguerre-polynomial 
     summands = re.split('\+', re.sub('-','+-',rhs)) 
     for s in summands: 
      m = re.match("^(?P<factor>-?[0-9]*(\.[0-9]*)?)(?P<poly>(\*?L\([0-9]+,[a-z]\))*)", s) 
      if not m: 
       print ' polynomial misformatted' 
       continue 
      f = m.group('factor') 
      print ' factor: ',f 
      p = m.group('poly') 
      for l in re.finditer("L\((?P<a>[0-9]+),(?P<b>[a-z])\)",p): 
       print ' poly: L(%s,%s)' % (l.group("a"),l.group("b")) 

這應該爲你的GI工作ven示例文件。

+0

謝謝你的回覆。解析器比我的嘗試更優雅:)直到它到達多項式部分才能正常工作。它與AttributeError出錯:'NoneType'對象沒有屬性'組'。我要求它打印m,當它達到F時它打印出無結果。我意識到我沒有完全正確地輸入F的輸入,所以在原始文章中做了一個小修改(只是在Laguerres之間),但是我不能明白爲什麼會導致重大問題。 – Yeti

+0

顯然,如果輸入文件與正則表達式不匹配,我上面的代碼就不夠完美,而且非常容易出錯。我將在一秒內更新我的代碼,以便在Laguerres之間使用'*'工作。但是,如果輸入文件有問題且正則表達式不匹配,則應該進行一些錯誤檢查。 –

+0

非常感謝您的幫助。我必須對創建這些輸入文件的代碼進行更改,現在括號是圍繞拉各爾三元組開始時的倍增因子。 要修改上面的Python代碼,我以下面的方式插入了兩個轉義的括號\\(和\\):m = re.match(「^ \\((P- ?[0-9] *(\ 。[0-9] *)?)\\)。這個循環遍歷Laguerres的三元組,但在係數負號的情況下崩潰,例如(-41.7694765)。是否有簡單的方法來解決這個問題? Once再次感謝你的幫助 – Yeti