gpt4 book ai didi

python - 如何使用 pyparsing 解析此列表?

转载 作者:行者123 更新时间:2023-12-05 01:49:44 24 4
gpt4 key购买 nike

我正在尝试使用 pyparsing 来解析包含“节标题”和“项目”的列表。在本例中,节是天数,而项目是我们需要的杂货买。

from pyparsing import *

input = """Monday
- eggs
- milk
Tuesday
- bread
- flour
"""

day = Word(alphas)("day")
item = Suppress("- ") + rest_of_line
items = OneOrMore(item)("items")
daily_shopping_list = OneOrMore(day + items)

print(daily_shopping_list.parse_string(input).asDict())

返回 {'day': 'Tuesday', 'items': ['bread', 'flour']}

所需的输出是 {{'day': 'Monday', 'items': ['eggs', 'milk']}, {'day': 'Tuesday', 'items': ['面包', '面粉']}}

为什么这段代码跳过星期一?

谢谢。

编辑:正如 Tim Roberts 提到的,删除 .asDict() 会产生一个有效的输出:

['星期一', ['鸡蛋', '牛奶'], '星期二', ['面包', '面粉']]

最佳答案

这是 pyparsing 的第一个很棒的项目。 pyparsing 提供的一些功能有助于返回这样的结构化数据。

首先,当您调用 parse_string() 时,它返回一个 pyparsing ParseResults https://pyparsing-docs.readthedocs.io/en/latest/pyparsing.html#pyparsing.ParseResults目的。如果你打印出来,你会得到:

result = daily_shopping_list.parse_string(input)
print(result)
['Monday', 'eggs', 'milk', 'Tuesday', 'bread', 'flour']

看起来像一个字符串列表,但有更多的特性。

首先要看的是调用dump() 方法。这将列出已解析的字符串,然后是缩进的命名项列表。

print(result.dump())
['Monday', 'eggs', 'milk', 'Tuesday', 'bread', 'flour']
- day: 'Tuesday'
- items: ['bread', 'flour']

正如蒂姆·罗伯茨 (Tim Roberts) 指出的那样,命名的默认设置类似于 Python 字典:最后存储的值就是您最终得到的值。

您实际上非常接近获得您想要的结构化结果。添加一个 pyparsing Group 表达式,更改此行:

daily_shopping_list = OneOrMore(day + items)

到这一行:

daily_shopping_list = OneOrMore(Group(day + items))

这将创建日项目组,在此更改之后,results.dump() 打印:

[['Monday', 'eggs', 'milk'], ['Tuesday', 'bread', 'flour']]
[0]:
['Monday', 'eggs', 'milk']
- day: 'Monday'
- items: ['eggs', 'milk']
[1]:
['Tuesday', 'bread', 'flour']
- day: 'Tuesday'
- items: ['bread', 'flour']

这实际上是一个包含 2 个 ParseResultsParseResults,每个解析的 Group 一个。 dump() 显示可用于访问命名值的名称。例如,您可以获得第一天的值:

results[0]["day"]
results[0]["items"]

就像他们是听写的一样。您还可以将它们视为对象中的属性(如果名称是有效的 Python 标识符):

results[0].day
results[0].items

如果您希望它们作为字典,则在每个包含的 ParseResults 上调用 as_dict():

print([day_list.as_dict() for day_list in result])
[{'day': 'Monday', 'items': ['eggs', 'milk']}, {'day': 'Tuesday', 'items': ['bread', 'flour']}]

如果你想把它作为一个嵌套的字典,其中每一天的名字都是子字典的字典键,你可以让 pyparsing 使用每个组中的第一个元素作为键,方法是包装 OneOrMore pyparsing Dict 中的表达式:

daily_shopping_list = Dict(OneOrMore(Group(day + items)))

现在 results.dump() 的第一部分显示了这些键:

[['Monday', 'eggs', 'milk'], ['Tuesday', 'bread', 'flour']]
- Monday: ['eggs', 'milk']
- day: 'Monday'
- items: ['eggs', 'milk']
- Tuesday: ['bread', 'flour']
- day: 'Tuesday'
- items: ['bread', 'flour']

您可以使用日期名称作为键:

result["Monday"]["items"]

现在调用 result.as_dict()pprint 为:

from pprint import pprint
pprint(result.as_dict())
{'Monday': {'day': 'Monday', 'items': ['eggs', 'milk']},
'Tuesday': {'day': 'Tuesday', 'items': ['bread', 'flour']}}

关于python - 如何使用 pyparsing 解析此列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73752507/

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