您好體驗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放在其中是很麻煩的。
歡迎任何想法。也許我過於複雜,並且有一種更簡單的方法來解析這個文件。
提前感謝
謝謝你的回覆。解析器比我的嘗試更優雅:)直到它到達多項式部分才能正常工作。它與AttributeError出錯:'NoneType'對象沒有屬性'組'。我要求它打印m,當它達到F時它打印出無結果。我意識到我沒有完全正確地輸入F的輸入,所以在原始文章中做了一個小修改(只是在Laguerres之間),但是我不能明白爲什麼會導致重大問題。 – Yeti
顯然,如果輸入文件與正則表達式不匹配,我上面的代碼就不夠完美,而且非常容易出錯。我將在一秒內更新我的代碼,以便在Laguerres之間使用'*'工作。但是,如果輸入文件有問題且正則表達式不匹配,則應該進行一些錯誤檢查。 –
非常感謝您的幫助。我必須對創建這些輸入文件的代碼進行更改,現在括號是圍繞拉各爾三元組開始時的倍增因子。 要修改上面的Python代碼,我以下面的方式插入了兩個轉義的括號\\(和\\):m = re.match(「^ \\((P- ?[0-9] *(\ 。[0-9] *)?)\\)。這個循環遍歷Laguerres的三元組,但在係數負號的情況下崩潰,例如(-41.7694765)。是否有簡單的方法來解決這個問題? Once再次感謝你的幫助 – Yeti