gpt4 book ai didi

python - 如何在 pyparsing 中迭代 ParseResults

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:32 25 4
gpt4 key购买 nike

我的 PyParsing 语法有以下测试代码:

from pyparsing import Word, nums, alphas, delimitedList, Group, oneOf
from pprint import pprint

field = Word(alphas)("field")
operator = oneOf("= +")("operator")
string_value = Word(alphas)("string")
int_value = Word(nums).setParseAction(lambda t: int(t[0]))("int")
value = (string_value | int_value )("value")
expression = Group(field + operator + value)("expression")
grammar = Group(delimitedList(expression, delim="&&"))("expr_list")

def test(s):
print "Parsing '{0}'".format(s)
tokenized = grammar.parseString(s)
for f in tokenized:
e = f.expression
pprint(dict(e.items()))

if __name__ == "__main__":
test("foo=1")
test("foo=1 && bar=2")
test("foobar=2 && snakes=4")

输出非常意外 - 似乎我只得到 tokenized 中的 last 表达式:

Parsing 'foo=1'
{'field': 'foo', 'int': 1, 'operator': '=', 'value': 1}
Parsing 'foo=1 && bar=2'
{'field': 'bar', 'int': 2, 'operator': '=', 'value': 2}
Parsing 'foobar=2 && snakes=4'
{'field': 'snakes', 'int': 4, 'operator': '=', 'value': 4}

我该如何解决这个问题?

最佳答案

未经测试,但我认为您只需要更改:

expression = (field + operator + value)("expression")

到:

expression = Group(field + operator + value)("expression")

编辑:好的,另一个变化。您的迭代代码查找名为“expression”的多个项目。在以“&&”分隔的列表中有多个名为“expression”的项目。不通过名称引用它们更简单,而是通过迭代“expr_list”中的分组表达式:

for f in tokenized['expr_list']: 
field = f['field']
op = f['operator']
value = f['value']
print field, op, value

我通常对解析结果使用dump 方法来查看数据是如何分组和命名的。如果我打印出 tokenized.dump() 我得到:

[[['foo', '=', 1], ['bar', '=', 2]]]
- expr_list: [['foo', '=', 1], ['bar', '=', 2]]
- expression: ['bar', '=', 2]
- field: bar
- int: 2
- operator: =
- value: 2

我可以看到我可以获得“expr_list”命名值。我还看到有一个子级别的“表达式”,但是由于这些键默认情况下是唯一的,就像在字典中一样,所以最后解析的组只有一个值。但是我可以访问“expr_list”中的多个组 - 如果我查看第 0 个项目(使用 print tokenized['expr_list'][0].dump()),我得到:

['foo', '=', 1]
- field: foo
- int: 1
- operator: =
- value: 1

因此我可以使用以下方法遍历“expr_list”中的组:

for f in tokenized['expr_list']: 
field = f['field']
op = f['operator']
value = f['value']
print field, op, value

我会得到:

foo = 1
bar = 2

没有必要将结果名称放在语法中的每个 级别 - 在这种情况下,我们通过遍历 expr_list 获得表达式,甚至没有使用表达式。事实上,如果你取最外层语法表达式的组,你也不需要'expr_list',只需迭代for f in tokenized:

当试图梳理您返回的 ParseResults 的内容时,dump 方法可能是最好的工具。

关于python - 如何在 pyparsing 中迭代 ParseResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11896431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com