Python Pyparsing infixNotation到解析树中:只有一个操作符在树中结束?

Python Pyparsing infixNotation到解析树中:只有一个操作符在树中结束?,python,pyparsing,infix-notation,Python,Pyparsing,Infix Notation,我的最终目标是应用SQLWHERE子句样式的查询来过滤数据帧。通过一些搜索,我找到了pyparsing的infixNotation方法 我在这里找到了一个中缀符号的示例: 但这实际上处理了符号,我需要在不同的数据上多次使用树。在查找有关解析树的帮助时,我发现了以下内容: 我从那里得到了堆栈实现。然而,它的行为并不像我期望的那样,所以我希望有人能告诉我我做错了什么 下面是我能想到的最简单的例子: from pyparsing import Word, alphas, infixNotation,

我的最终目标是应用SQLWHERE子句样式的查询来过滤数据帧。通过一些搜索,我找到了pyparsing的infixNotation方法

我在这里找到了一个中缀符号的示例:

但这实际上处理了符号,我需要在不同的数据上多次使用树。在查找有关解析树的帮助时,我发现了以下内容:

我从那里得到了堆栈实现。然而,它的行为并不像我期望的那样,所以我希望有人能告诉我我做错了什么

下面是我能想到的最简单的例子:

from pyparsing import Word, alphas, infixNotation, opAssoc

exprStack=[]
def pushFirst( strg, loc, toks ):
    exprStack.append( toks[0] )

def addAnd():
    exprStack.append("and")

varname = Word(alphas).setParseAction( pushFirst )

operators=[("and", 2, opAssoc.LEFT,addAnd)]

whereExpr = infixNotation(varname,operators)

exprStack=[]
teststring = "cheese and crackers and wine"
parsed=whereExpr.parseString(teststring)
for p in exprStack:
    print p
我从这段代码中得到的是:

cheese
crackers
wine
and
从我对中缀表示法工作原理的理解中,我希望得到的是:

cheese
crackers
wine
and
and
我也试着用奶酪、饼干、葡萄酒和呜呜声来运行它,但我仍然只有一个,而且在我的列表中

我在使用infixNotation方法时有什么误解


感谢您

首先用pyparsing的traceParseAction诊断Decorator装饰您的解析操作

@traceParseAction
def addAnd():
    exprStack.append("and")
traceParseAction将显示匹配的源行、匹配标记的起始位置、传递给解析操作的标记以及解析操作返回的值:

>>entering addAnd(line: 'cheese and crackers and wine', 0, 
                 ([(['cheese', 'and', 'crackers', 'and', 'wine'], {})], {}))
<<leaving addAnd (ret: None)
您将获得更具可读性的:

[['cheese', 'and', 'crackers', 'and', 'wine']]
[0]:
  ['cheese', 'and', 'crackers', 'and', 'wine']
您可以看到,匹配的标记不仅包含“and”,还包含所有和ed项,因此您需要将匹配标记中的“and”尽可能多地推送到exprStack上

def addAnd(tokens):
    exprStack.extend(tokens[0][1::2])
通过此更改,您现在应该将其视为返回的堆栈:

cheese
crackers
wine
and
and

首先,用pyparsing的TraceParserAction诊断Decorator装饰您的解析操作

@traceParseAction
def addAnd():
    exprStack.append("and")
traceParseAction将显示匹配的源行、匹配标记的起始位置、传递给解析操作的标记以及解析操作返回的值:

>>entering addAnd(line: 'cheese and crackers and wine', 0, 
                 ([(['cheese', 'and', 'crackers', 'and', 'wine'], {})], {}))
<<leaving addAnd (ret: None)
您将获得更具可读性的:

[['cheese', 'and', 'crackers', 'and', 'wine']]
[0]:
  ['cheese', 'and', 'crackers', 'and', 'wine']
您可以看到,匹配的标记不仅包含“and”,还包含所有和ed项,因此您需要将匹配标记中的“and”尽可能多地推送到exprStack上

def addAnd(tokens):
    exprStack.extend(tokens[0][1::2])
通过此更改,您现在应该将其视为返回的堆栈:

cheese
crackers
wine
and
and

哇,这本书的作者帮助了我!谢谢哇,这本书的作者帮助了我!谢谢我最终放弃了堆栈方法,使用了Paul McGuire首选的对象方法。对于任何正在寻找将类型查询应用于pandas dataframes的SQL的人,您可以在github上找到一个语法有限的版本:Pyparsing不再托管在wikispaces.com上。Go to我最终放弃了堆栈方法,并使用了Paul McGuire首选的对象方法。对于任何正在寻找将类型查询应用于pandas dataframes的SQL的人,您可以在github上找到一个语法有限的版本:Pyparsing不再托管在wikispaces.com上。去