我正在尝试使用以下格式解析输入文件。
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对象的正确分配,而这并不能给我现有的东西。
答案 0 :(得分:0)
在这种情况下,使用Forward
比matchPreviousLiteral
更容易:
content = begin.suppress() + header + pp.SkipTo(end + matchPreviousLiteral(header))
您要匹配 any end
,但是您想要的是与先前end
匹配的begin
。