You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyparsing解析购物清单为何丢失Monday数据?

问题:pyparsing解析购物列表时丢失第一个日期条目

你尝试用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': ['bread', 'flour']}]

疑问:为什么代码会跳过Monday?

补充:正如Tim Roberts所说,移除.asDict()后能得到有效输出:

['Monday', ['eggs', 'milk'], 'Tuesday', ['bread', 'flour']]

原因与解决方案

原因

asDict()方法会将解析结果中同名的键值对合并,后面的内容会直接覆盖前面的。你的解析规则里,每个day + items都会生成一组名为day和items的结果,当调用asDict()时,第二组的day和items会覆盖第一组,最终只保留最后一组数据。

解决方案

要实现分组后的字典列表,需要把单个日期加条目组合定义成一个独立的分组单元,让每组结果单独成为一个字典。修改代码如下:

from pyparsing import *

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

day = Word(alphas)("day")
item = Suppress("- ") + rest_of_line
items = OneOrMore(item)("items")
# 将单组日期+条目包装为Group,命名为daily_entry
daily_entry = Group(day + items)("daily_entry")
daily_shopping_list = OneOrMore(daily_entry)

# 提取分组后的字典列表
result = daily_shopping_list.parse_string(input).asDict()["daily_entry"]
print(result)

执行后输出符合预期:

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

另外,也可以不依赖asDict(),直接遍历原始解析结果来构建目标列表:

parsed = daily_shopping_list.parse_string(input)
result = []
for i in range(0, len(parsed), 2):
    result.append({"day": parsed[i], "items": parsed[i+1]})
print(result)

内容的提问来源于stack exchange,提问作者Richard Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:00:47