PyParsing:使用SkipTo(),标记的数据以及可能的Forward()

时间:2018-08-02 03:49:18

标签: python-3.x pyparsing

我正在尝试使用以下格式解析输入文件。

file = "Begin 'big section header' 
          #... section contents ...
          sub 1: value
          sub 2: value
          ....
          Begin 'interior section header'
          ....
          End 'interior section header'

        End 'big section header'"

返回一个列表,该列表贪婪地获取标记的节标题值之间的所有内容

['section header', ['section contents']]

我目前的尝试是这样的

import pyparsing as pp

begin = pp.Keyword('Begin')
header = pp.Word(pp.alphanums+'_')
end = pp.Keyword('End')
content = begin.suppress() + header + pp.SkipTo(end + header)

content.searchString(file).asList()

返回

['section header', ['section contents terminated at the first end and generic header found']]

我怀疑我的语法需要更改为

的某种形式
begin = pp.Keyword('Begin')
header = pp.Word(pp.alphanums+'_')
placeholder = pp.Forward()
end = pp.Keyword('End')

placeholder << begin.suppress() + header
content =  placeholder + pp.SkipTo(end + header)

但是我无法终生找出对Forward对象的正确分配,而这并不能给我现有的东西。

1 个答案:

答案 0 :(得分:0)

在这种情况下,使用ForwardmatchPreviousLiteral更容易:

content = begin.suppress() + header + pp.SkipTo(end + matchPreviousLiteral(header))

您要匹配 any end,但是您想要的是与先前end匹配的begin