pyparsing中字符串解析复杂的逻辑运算符

Dro*_*oid 5 parsing pyparsing query-string python-3.x

我正在尝试解析逻辑运算符,查询字符串见下文

code!=720 AND first_name=abc OR last_name=def AND status_code=OK
Run Code Online (Sandbox Code Playgroud)

并将解析后的字符串作为二叉树获取。对于上面的表达式,预期的解析表达式应该如下所示

[[['code', '!=', '720'], 'AND', ['first_name', '=', 'abc']], 'OR', [['last_name', '=', 'def'], 'AND', ['status_code', '=', 'OK']]]
Run Code Online (Sandbox Code Playgroud)

我尝试执行此代码,但没有得到所需的输出

operator = pp.Regex(">=|<=|!=|>|<|=").setName("operator")
number = pp.Regex(r'[+-]?\w+(:?\.\w*)?(:?[eE][+-]?\w+)?')
word = pp.Word(pp.alphas, pp.alphanums + "_-*(1234567890 ,)")
term = word | number
condition = pp.Group(term + operator + term)


expr = pp.operatorPrecedence(condition,
         [('NOT', 1, pp.opAssoc.RIGHT,),
          ('AND', 2, pp.opAssoc.LEFT,),
          ('OR', 2, pp.opAssoc.LEFT,)])
Run Code Online (Sandbox Code Playgroud)

例子

query_string = 'code!=720 AND first_name=abc OR last_name=def AND status_code=OK'
print(expr.parseString(query_string)[0])
Run Code Online (Sandbox Code Playgroud)

并且输出是错误的

 [['code', '!=', '720'], 'AND', ['first_name', '=', 'abc OR last_name']]
Run Code Online (Sandbox Code Playgroud)

你能帮我写出正确的条件吗?

Pau*_*McG 5

上面的所有注释都包含在这段代码中:

import pyparsing as pp

operator = pp.oneOf(">= <= != > < =").setName("operator")
number = pp.pyparsing_common.number()
# there is no space character in this pp.Word expression
word = pp.Word(pp.alphas, pp.alphanums + "_-*(1234567890,)")
term = word | number | pp.quotedString
condition = pp.Group(term + operator + term)


expr = pp.operatorPrecedence(condition,
         [('NOT', 1, pp.opAssoc.RIGHT,),
          ('AND', 2, pp.opAssoc.LEFT,),
          ('OR', 2, pp.opAssoc.LEFT,)])

query_string = 'code!=720 AND first_name=abc OR last_name=def AND status_code=OK'
print(expr.parseString(query_string, parseAll=True)[0])
Run Code Online (Sandbox Code Playgroud)

这给出了这个输出:

[[['code', '!=', 720], 'AND', ['first_name', '=', 'abc']], 'OR', [['last_name', '=', 'def'], 'AND', ['status_code', '=', 'OK']]]
Run Code Online (Sandbox Code Playgroud)