我试图实现一个包含运算符和数字的堆栈。运营商可以是:不,和,或。运算符与正则表达式匹配:
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
这里的问题是它永远不会进入if。我不确定问题是匹配对象是否与字符串进行比较。
答案 0 :(得分: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
个对象被实例化时,即使值相等,它们也不会具有与其他实例相同的标识,因此您必须使用相等比较进行比较,因为该比较运算符是针对这些对象实现的。通常预期的方式。