python,pyparsing,stopOn和重复结构

时间:2019-02-10 02:34:21

标签: python-2.7 pyparsing

是时候重新掌握我的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()锁定了一些东西,但是在更一般的情况下,字符串没有任何区别可以做什么呢?标签字符串

仍在搜索的史蒂夫

1 个答案:

答案 0 :(得分:1)

要在解析器中修复的三件事:

  1. 您给定的ppKeyNames包含'_',但您没有将它们包含在ppKeyName的定义中

  2. ppObjectLabel将解析“主要对象”,后跟一个“:”,但实际上“:”在任何地方都不会被解析。只需将其添加到ppObjectLabel即可,而不是使用pp.FollowedBy。

  3. last_occurance_of是不必要的,下一个标签的ppKeyName不会混淆ppObjectRegex的重复