使用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
相关产品推荐
相关产品推荐

