2012-11-08 113 views
0

所以我試圖找出如何檢測操作數和操作數的數學表達式如何找到一個字符串操作數和操作

例:1+2*9/2

我試圖分開操作數和操作使用函數轉換成自己的形式,因爲我們必須檢查必須完成多少操作並且按照正確的順序(PEDMAS)。

我已經採取了方程式,並且已經取出了所有空間,現在我必須找到方程中操作數和操作的數量,然後使用返回來查找用戶給定數學表達式的答案。

任何提示?

+0

您必須將其解析爲抽象語法樹(AST)才能確定。 –

+0

我建議你先從中綴到後綴轉換。然後,您可以使用堆棧和運算符優先級評估表達式。 顯然這不會給你類型安全(尺寸分析),但可以幫助你前進。 請參閱:http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm – Sarang

+0

謝謝,這似乎有助於我更多地瞭解操作順序 – Jen

回答

0

如果表達式可以爲您的樣品並非如此簡單,你可以使用RPN - reverse polish notation

如果你的表達是非常簡單(只有基地OPS和值小於10),你只需要數比你可以使用像這個我猜:

ops = '+-*/' 
operationsCount= sum(expr.count(op) for op in ops) 
operandsCount = len(expr) - operationsCount 

或者您可以使用此:

def get_cnt(expr): 
    ops = '+-*/' 
    res = [expr] 
    for op in ops: 
     tmp = [] 
     for x in expr: 
      tmp.extend(x.split(op)) 
     res = tmp[:]   
    return len(res), sum(expr.count(op) for op in ops) 

現在你有符和操作數的數量 - 這是相當Ë asily在ops/opd上正確地分割行並計算表達式。

+0

爲op操作的和(expr.count(op))只計算操作的位置號? – Jen

+0

s.count(i) - 我在s中發生的總次數 - 這意味着我們總結出現的並非 –

+0

謝謝,s.count(i)解釋幫助 – Jen

0

如果您被允許,我建議您查看ast模塊。它被設計爲使用Python自己的解析器爲你做這樣的事情。

對於實際的應用程序,您可能會使用像Ply這樣的解析器生成器。

對於像這樣的簡單家庭作業,您可能需要手動編碼解析器。首先標記它(str.split),找到括號,然後使用優先級將其他操作分組。

+0

ast模塊?你可以爲我檢討一下嗎?我不認爲我的教授提到ast – Jen

+0

我雖然使用拆分,但它是我們實際上不允許使用的一個東西,這是一個恥辱,它會使這容易很多 – Jen

+0

那麼你允許使用什麼? – Antimony

0
import re 
exp = 1+2*9/2 
ops = re.findall(r'[\+\-*/]', exp) 
print len(ops) 

我不知道爲什麼你要找到操作數 的數量,我認爲

re.findall(r'[0-9]+|[\+\-*/()]', exp) 

更好。

所以我認爲正則表達式可以幫助您

+0

操作數的數量是這樣我可以區分它是否只有一個操作數(例如1 * 5)與一個更復雜的表達式(1 + 2 * 9/2) – Jen

+0

好的,但是如果你想構建一個計算器,我認爲不需要區分1 * 5和1 + 2 * 9/2。你可以使用自己構建的兩個棧,或者圖書館的numpy可以幫助你 –

+0

@Kaifeng Jin:仔細看看你的!這樣它不會工作! ;-) –