Python 2.7 python、pyparsing、stopOn和重复结构

Python 2.7 python、pyparsing、stopOn和重复结构,python-2.7,pyparsing,Python 2.7,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.Followed

是时候复习一下我的语法分析技能了

给定一个包含重复结构的文件

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']]
那么我在这里错过了什么?我意识到我很幸运,因为组成列表的字符串都有相同的开头,这使得()的最后一次出现可以锁定,但是在更一般的情况下,如果字符串没有任何区别于标记字符串,我们该怎么办呢


仍在搜索Steve

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

  • 您给定的ppKeyName包括'\u',但不包括在ppKeyName的定义中

  • ppObjectLabel将解析后跟“:”的“主对象”,但“:”实际上不会在任何地方被解析。只需将其添加到ppObjectLabel,而不使用pp.FollowedBy,这是最简单的方法

  • 的最后一次出现是不必要的,ppObjectRegex的重复不会被下一个标记的ppKeyName混淆