2016-11-17 45 views
0

爲了編寫一個計算器,比如python interpeter,我想檢查我的表達式的有效性。Python在字符串中搜索重複的運算符

我想檢查重複的數學運算符的字符串,我不想捕捉任何東西,只是爲了知道它們是否存在,在這種情況下表達式將是無效的。

4 ++ - + 4是有效的。

4 * -8無效

4-/7無效

4/-4是有效的,我的失敗很可能在這裏。

minut和plus可以重複自己,但是 - *例如無效。 就像Python中間人的工作方式。 這是我的,作爲一個正則表達式,但任何更簡單的解決方案是受歡迎的,即使不是正則表達式是偉大的。

[*/^%\-+][*/^%] | [\-+*/^%][*/^%] 

Link

Basicially,檢查是否符*/^% - +要麼通過之前或之後*/^%(不加號和減號)

+0

如果什麼運營商是由空格分隔? –

+0

運算符不用空格隔開,並且空格在我的文本中不存在(我應該提到這個嗎?) – Lumon

+0

'^^'應該產生什麼結果?一隻貓?您可能需要重新定義您的問題:) – Jan

回答

1

再次更簡潔的解決方案將可以是CFG或基於堆棧的中綴表達式。然而,你可以破解和嘗試的是以下想法。

構建所有運營商的產品,像這樣:

from itertools import product as p 
all=list(p('*/^%-+',repeat=2)) 
all=map(lambda x:''.join(x),all) 

invalids=[..write them by hand in here(hacky part)] 
valids=filter(lambda x:x not in invalids,all) 

現在你只剩下長度爲2的所有有效的操作您可以爲2的窗口掃描您的字符串,當你發現一個一對不屬於valids的操作符可以聲明表達式無效並繼續前進。

另一種可以實現的方法是基於規則的方法。構造一個以操作符爲關鍵字的字典,對於每個操作符,該值將成爲一個列表,其中包含所有可以遵循它的操作符。

那麼你的問題變得人品我與有效性條件是

string[i+1] in dictionary[string[i]]

檢查你的字符串中的一個。如果你找到一個CFG解決方案,它的美麗,讓我知道