2013-07-07 25 views
2

我試圖找到一種方法來有效地將係數從包含符號多項式的字符串中提取出來,並將它們放入列表中,其中列舉的是權重。例如,一個字符串從Python中的字符串中提取係數的好方法是什麼?

x^10+6x^4-5x^2+x-11 

將列表

[-11, 1, -5, 0, 6, 0, 0, 0, 0, 0, 1] 

我正在努力學習正則表達式來處理它,但我對它的瞭解還不夠好,激發信心的魯棒性(顯然,邏輯告訴我,否則)。任何人都可以讓我在正確的軌道上解決這個問題嗎?

+0

如何強大的解決方案是否需要註冊後才能條款的重新排序?該程序是否能夠處理'3x^2 - 5'和'-5 + 3x^2'或者你的多項式總是有降權的條件?我最初的想法是,正則表達式不是最好的選擇,像[pyparsing](http://pyparsing.wikispaces.com/Examples)會更合適。 – ChrisP

+0

@ChrisP我希望能夠成爲索引的權力,所以這將照顧我相信的魯棒性。最大的障礙似乎是處理0和1次方係數。我還沒有拿出一個正則表達式來處理這些。 – jeffberhow

回答

3

這裏有一種方法將方程解析成帶有自我記錄鍵的字典列表。這種方法在精神上與Jmac非常好的答案相似。

eq = 'x^10+6x^4-5x^2+x-11' 

patt = r'(?P<sign>[-+]?)(?P<coeff>\d*)(?P<x>x?)(?:\^(?P<exp>\d+))?' 
rgx = re.compile(patt) 

eq_parts = [m.groupdict() for m in rgx.finditer(eq)][0:-1] 

for eqp in eq_parts: 
    print eqp 

輸出:

{'x': 'x', 'coeff': '', 'exp': '10', 'sign': ''} 
{'x': 'x', 'coeff': '6', 'exp': '4', 'sign': '+'} 
{'x': 'x', 'coeff': '5', 'exp': '2', 'sign': '-'} 
{'x': 'x', 'coeff': '', 'exp': None, 'sign': '+'} 
{'x': '', 'coeff': '11', 'exp': None, 'sign': '-'} 
+0

這個比我好。我仍然沒有習慣於命名每個匹配的部分。 – Jmac

+0

我不得不說,這很酷。 – jeffberhow

4

模式r'-?\d*x\^\d+|-?\d+x?|-?x'應該拆分字符串。

例如:

import re 

string = "x^10+6x^4-5x^2+x-11" 

pattern = re.compile(r'-?\d*x\^\d+|-?\d+x?|-?x') 
matches = pattern.findall(string) 
# matches == ['x^10', '6x^4', '-5x^2', 'x', '-11'] 

其餘部分應是可行的。我把它作爲讀者的練習。

+0

這是魔術。你介意我問你曾經有哪些材料能夠達到這種正則表達法的效果嗎? – jeffberhow

+0

官方的[re文檔](http://docs.python.org/2/library/re.html)有所幫助。在查看和學習特殊字符之後,很多關於查找表達式的信息只是試驗和錯誤。 – Jmac

相關問題