Pyparsing 2 locatedExpr与Pyparsing 3 Located的差异问询
Pyparsing v2与v3中locatedExpr/Located对命名捕获组的处理差异
核心差异
- Pyparsing v2的locatedExpr:当解析模式包含带命名捕获组的Regex时,解析结果会同时生成两个部分:
- 顶层独立字段(比如你的
abc),直接对应Regex的命名捕获组; - 完整的
value列表,包含Literal、Regex匹配内容、SkipTo的结果。
- 顶层独立字段(比如你的
- Pyparsing v3的Located:仅会将命名捕获组的结果嵌套在对应Regex元素的
value子结构中,不会自动提升为顶层独立字段;只有通过setResultsName()显式给解析元素命名时,才会在顶层结果中生成对应字段。
差异原因
Pyparsing v3对结果结构的设计做了针对性调整,核心是保持结果层级的一致性:
- v2中自动将Regex命名捕获组提升到顶层,容易引发命名冲突(比如不同Regex的捕获组重名),也模糊了结果的层级关系;
- v3则明确区分“元素级命名”(通过
setResultsName())和“Regex内部子分组命名”,后者仅作为该Regex元素的子结果存在,避免了上述问题。
适配方案(保留分组解析并得到顶层字段)
如果需要在v3中实现类似v2的顶层独立字段效果,可给Regex元素显式设置结果名:
import pyparsing as p # 给Regex添加setResultsName,与捕获组名一致(也可以用不同名称) parser = p.Literal('line ') + p.Regex(r'(?P<abc>\d+)').setResultsName('abc') + p.SkipTo(p.LineEnd().suppress()) # 用Located包裹 located_parser = p.Located(parser)
此时Located的结果中,顶层会出现abc字段,同时Regex的value中也会保留abc子分组内容。
内容的提问来源于stack exchange,提问作者user19898808
相关产品推荐
相关产品推荐

