pyparsing单独解析正常,组合解析抛出ParseException问题求助
pyparsing组合解析失败问题解决
问题原因
单独解析feature或user时,pyparsing默认仅匹配到第一个符合规则的片段就返回,忽略后续未匹配的内容(比如features_str里的floating license行)。但组合解析时,feature + OneOrMore(user)要求解析完feature后立刻匹配user规则,此时后续的floating license行不符合user的结构,直接触发解析错误。
解决方案
方案1:修改feature规则,处理无关行
直接在feature规则末尾添加对floating license这类无关内容的跳过逻辑,确保解析完feature相关内容后,自动跳过后续无关行,为匹配user规则扫清障碍:
feature = ( QuotedString(quote_char='"').setResultsName("name") + Word(alphanums + ".").setResultsName("version") + Suppress(", vendor:") + Word(alphas).setResultsName("vendor") + Suppress(", expiry: ") + Word(nums) + Suppress("-") + Word(alphas) + Suppress("-") + Word(nums) + Suppress("vendor_string: ") + Word(alphanums + ":") + Word(alphas).setResultsName("type") + Suppress(SkipTo(LineEnd())) # 跳过当前行剩余内容 + Suppress(Optional(Word(alphas) + Word(alphas))) # 跳过"floating license"行 )
方案2:在组合表达式中跳过中间无关内容
如果不想修改原有feature规则,可以在组合表达式里加入跳过逻辑,跳过feature和user之间的无关内容:
expr = feature + Suppress(SkipTo(user)) + OneOrMore(user)
额外建议
测试解析时建议添加parse_all=True参数,强制解析整个输入字符串,避免忽略未处理内容导致的隐藏问题:
expr.parse_string(features_and_users, parse_all=True)
内容的提问来源于stack exchange,提问作者justin
相关产品推荐
相关产品推荐

