Python:如何比较not运算符与' not'串?

时间:2014-03-26 03:19:40

标签: python logical-operators

我试图实现一个包含运算符和数字的堆栈。运营商可以是:不,和,或。运算符与正则表达式匹配:

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。我不确定问题是匹配对象是否与字符串进行比较。

1 个答案:

答案 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个对象被实例化时,即使值相等,它们也不会具有与其他实例相同的标识,因此您必须使用相等比较进行比较,因为该比较运算符是针对这些对象实现的。通常预期的方式。