2014-03-26 25 views
0

我想實現一個包含操作符和數字的堆棧。運營商可以是:不,和,或。該運營商正在對正則表達式匹配:Python:如何比較操作符與'不'字符串?

expression = '((NOT (2 <= 4)) OR (2 = 2))' 
log_op = re.compile('NOT|AND|OR|not|and|or') 
log_match = log_op.match(expression) 

if log_match is not None: 
    operator_stack.push(log_match.group().lower()) 

現在我需要採取一些行動,如果我突然從堆棧這些運營商之一:

operator = operator_stack.pop() 
if operator is "not": 
    # invert some True to False 

這裏的問題是,它不會進入,如果。我不確定問題是匹配對象是否不與字符串進行比較。

+0

'operator'的值是什麼? – thefourtheye

+0

這意味着什麼 - 像這樣的運營商_? '運算符.__不從stdlib中? –

+0

'if!operator:' – alfasin

回答

0

首先,match字面上匹配整個字符串以查看它是否與表達式匹配,但顯然沒有。最後,如果您試圖解析整個輸入表達式,則應將其解析爲抽象語法樹 - 堆棧可能不會表示預期的表達式,除非您忽略操作順序或採取其他方法來補償此表達式。糾正最後一個超出了這個問題的範圍。

要找到一個值,你要使用search

順便說一句,有一個operator模塊,你可以考慮尋找到。

>>> log_op.match(expression) 
>>> log_op.search(expression) 
<_sre.SRE_Match object at 0x22068b8> 

注意匹配返回任何內容,但搜索一樣,因此我們將使用這一點,看你如何比較這

>>> log_op.search(expression).group().lower() 
'not' 
>>> log_op.search(expression).group().lower() is "not" 
False 
>>> log_op.search(expression).group().lower() == "not" 
True 

由於str對象實例化時,他們不會有相同的身份作爲其他實例,即使值相等,所以您必須使用相等比較進行比較,因爲該比較運算符是以通常預期的方式爲這些對象實現的。

+0

我剛剛編輯我的帖子,使我的觀點更清晰。我認爲這可能與正則表達式匹配對象有關。 – loxosceles

+0

感謝您的澄清,因爲如果沒有這些,我們不知道您可能會問什麼。我更新了我的答案。 – metatoaster