蟒,pyparsing,stopOn和重复结构

问题描述 投票:1回答:1

时间已经到了刷了我的pyparsing技能。

给定含重复结构一个文件

space_missions
Main Objects:
  /Projects/antares_III
  /Projects/apollo
ground_missions
Main Objects:
  /Projects/Barbarossa
  /Projects/Desert_Eagle

我切碎,同比下降2.7脚本

def last_occurance_of( expr):
  return expr + ~pp.FollowedBy( expr)

ppKeyName = pp.Word( pp.alphanums)
ppObjectLabel = pp.Literal("Main Objects") + pp.FollowedBy(':')
ppObjectRegex = pp.Regex(r'\/Projects\/\w+')
ppTag = pp.Group( ppKeyName.setResultName('keyy') + pp.Suppress( ppObjectLabel) + pp.ZeroOrMore( ppObjectRegex, stopOn=last_occurance_of( ppObjectRegex)).setResultName('objects') )
ppTags = pp.OneOrMore( ppTag)
with open( fn) as fp:
  slurp = fp.read()
results = ppTags.parseString( slurp)

我想获得的成绩来回报

[['space_missions',['/Projects/antares_III','/Projects/apollo']
,['ground_missions',['/Projects/Barbarossa','/Projects/Desert_Eagle']]

那我在这里失踪?我知道我在那组成名单都赋予last_occurance_of()的东西,锁定到同一开头的字符串幸运的,但到底是什么人在更普遍的情况,那里的字符串有什么可区分它们标签串

尽管如此,搜索史蒂夫

python-2.7 pyparsing
1个回答
1
投票

三件事情在你的解析器来解决:

  1. 你给ppKeyNames包括“_的,但你不包括他们在ppKeyName的定义
  2. ppObjectLabel将解析接着是“主要目的”“:”,但“:”实际上并没有取得任何进展解析。简单的方法就是把它添加到ppObjectLabel而不是使用pp.FollowedBy的。
  3. last_occurance_of是不必要的,ppObjectRegex的重复不会被下一个标签的ppKeyName困惑
© www.soinside.com 2019 - 2024. All rights reserved.