2016-02-26 44 views
2

我試圖評估這個字符串。 「1 + 2^4 * 4 *(4 + 4 * 9)-10」評估字符串「1 + 2^4 * 4 *(4 + 4 * 9)-10」

我的策略是採取每個元素,把它放在一個列表中,轉換爲正確的數據類型(int)或運算符,連接然後評估。我試圖避免使用eval()和ast.literal_eval()拋出一個「格式錯誤的字符串錯誤」。我目前被困在需要將運算符從字符串轉換爲運算符的地步。

這是我到目前爲止已經完成:

equation = ("1+2^4*4*(4+4*9)-10") 

listint1 = 0 
listint2 = 1 
finallist = [] 
for elements in equation: 
    finallist.append(equation[listint1:listint2]) 
    listint1 = listint1 + 1 
    listint2 = listint2 + 1 

finalfinallist = [] 
for element in finallist: 
    if element.isdigit() == True: 
     finalfinallist.append(int(element)) 
    else: 
     finalfinallist.append(element) 

for element in finalfinallist: 
    if element == str: 
     if element == "+": 
      element = + 
     elif element == "^": 
      element =^
     elif element == "*": 
      element = * 
     elif element == "(" 
      element = (
     elif element == ")": 
      element =) 
     elif element == "-" 
      element = - 


print finalfinallist 

的思考?

+0

這有幫助嗎? https://gist.github.com/nava45/6333409#file-infix-expression-evaluation – nehemiah

回答

2

你試圖建立的是一個解析器。你可以看看https://en.wikipedia.org/wiki/Comparison_of_parser_generators。解析器用於實現上下文無關語法,請參閱https://en.wikipedia.org/wiki/Context-free_grammar

我假設您指的是指數運算,而不是bitwise-xor(按照python運算符)。

嘗試解析2^4*4時可能會有歧義,因爲它可能是(2^4)* 4 = 16 * 4 = 64或2^(4*4) = 2^16 = 65536。我不知道ast,但試着看看「結合規則」。

0

你可能想從構建一個表達式樹開始,這種事情!

Wikipedia: Expression Trees

這將使處理運營商比較容易,這樣你就知道在什​​麼時候操作,並且可以做一個字符串比較,以確定表達式樹的操作數使用什麼操作!請記住,我從來沒有必要在Python中這樣做,只有在C中。所以如果有更多的Pythonic方法來做到這一點,我目前還沒有意識到,並且很樂意聽到它。