使用Pyparsing解析类XML自定义格式并实现外部文件值修改
问题修复方案
语法与逻辑错误修正
- 字典定义语法错误:你定义的
valuesToUpdate多了一行无效空字符串,首先修正语法:
valuesToUpdate = { "building": "home" }
- 解析结果无
name属性:当前所有解析规则都没有给匹配字段设置命名,所以tokens.name永远不存在,判断始终不成立进入else分支。需要给需要匹配修改的字段加结果命名,比如要识别building标签就修改为:
nameBuilding = Literal("building").setResultsName("name")
其他需要修改的字段如position、direction等,也按照这个规则加对应命名即可。
- 未绑定解析动作:你写的
updateSelectedDefinitions函数没有通过addParseAction绑定到对应解析规则上,解析过程不会触发该函数。比如要在匹配building标签时执行更新,需要加绑定逻辑:
buildingzahl.addParseAction(updateSelectedDefinitions)
- Suppress使用不当:你把所有
<>、[]都设置为Suppress,解析时会直接丢弃这些结构符号,后续修改后无法重建原始格式。建议只把无用内容设为Suppress,保留结构符号的匹配。 - 转义字符匹配错误:你在解析规则里写的
Literal("<...")是错的,<是HTML转义后的显示内容,实际文件里的起始符号是<,直接写<才能匹配到对应内容。 - 更新函数逻辑错误:
- 原代码
return "%" % tokens.name, newVal格式化语法完全错误,需要按照你的自定义脚本格式拼接修改后的内容 - 不需要修改的标签不要抛异常,直接返回原始tokens即可,不然会中断解析流程
修正后的更新逻辑示例:
- 原代码
def updateSelectedDefinitions(tokens): if "name" in tokens and tokens.name in valuesToUpdate: new_val = valuesToUpdate[tokens.name] # 按照你的原始格式拼接修改后的标签,此处以building标签为例 return f"<[{new_val}][element][{tokens[0]}]>" # 不需要修改的内容直接返回原内容 return tokens
内容写回逻辑补充
你当前的代码只有解析逻辑,没有修改后写回文件的步骤。如果要生成修改后的完整文件,建议使用Pyparsing的transformString方法,自动应用所有解析动作返回修改后的完整字符串:
modified_content = fileganz.transformString(toc) with open("修改后的文件路径", "w", encoding="utf-8") as f: f.write(modified_content)
内容的提问来源于stack exchange,提问作者Liri22
相关产品推荐
相关产品推荐

