是时候重新掌握我的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()锁定了一些东西,但是在更一般的情况下,字符串没有任何区别可以做什么呢?标签字符串
仍在搜索的史蒂夫
答案 0 :(得分:1)
要在解析器中修复的三件事:
您给定的ppKeyNames包含'_',但您没有将它们包含在ppKeyName的定义中
ppObjectLabel将解析“主要对象”,后跟一个“:”,但实际上“:”在任何地方都不会被解析。只需将其添加到ppObjectLabel即可,而不是使用pp.FollowedBy。
last_occurance_of是不必要的,下一个标签的ppKeyName不会混淆ppObjectRegex的重复