2014-03-26 1 views
0

저는 연산자와 숫자를 포함하는 스택을 구현하려고합니다. 연산자는 다음 중 하나 일 수 있습니다. not, and, or. 연산자는 정규 표현식에 대해 일치 : 나는 스택에서 이러한 연산자 중 하나를 팝업 경우Python : 연산자가 아닌 'not'문자열과 비교하는 방법?

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

'연산자'의 값은 무엇입니까? – thefourtheye

+0

그것은 무엇을 의미합니까? stdlib에서'operator____ not__' 연산자를 사용합니까? –

+0

'if! operator :' – alfasin

답변

0

첫째로, match은 문자 그대로 전체 문자열과 일치하여 명확하게 일치하지 않는 표현과 일치하는지 확인합니다. 마지막으로, 전체 입력 표현식을 구문 분석하려고하면 추상 구문 트리로 구문 분석해야합니다. 조작 순서를 무시하거나이를 보완하는 다른 방법이 없으면 스택이 의도 한 표현을 나타내지 않을 것입니다. 마지막 문제를 해결하는 것은이 질문의 범위를 벗어납니다.

당신은 여담으로 search

를 사용하려면, 값을 찾으려면, 당신이 찾고 고려해야 수있는 operator 모듈이있다.

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

주 일치하는 아무것도 반환하지 않지만 검색했다, 그래서 우리는 그들이 동일한 ID가없는 것를 사용하고,

>>> 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