Python 文件的单独章节

Python 文件的单独章节,python,pyparsing,Python,Pyparsing,我必须解析具有嵌套结构的文档 它包含具有标题、键和值对的部分 txt_1 = ''' header1: key1: 1a key2: 2b ''' txt_2 = ''' section1: key1: 1a section2: key2: 2b key3: 3c ''' 我在pyparsing中编写了简单语法,它适用于只有一个节的简单文档,但当我尝试用空行分隔多个节来解析文档时,语法失败 HEADER = ( ( Word(alphanums)

我必须解析具有嵌套结构的文档

它包含具有标题、键和值对的部分

txt_1 = '''
header1:
  key1: 1a
  key2: 2b
'''

txt_2 = '''
section1:
  key1: 1a

section2:
  key2: 2b
  key3: 3c
'''
我在
pyparsing
中编写了简单语法,它适用于只有一个节的简单文档,但当我尝试用空行分隔多个节来解析文档时,语法失败

HEADER = (
    (
        Word(alphanums)
        + Suppress(Literal(':'))
    ).setResultsName('header')
)
PARAM = Word(alphanums).setResultsName('param')
VALUE = Word(alphanums).setResultsName('value')

LINE = (
    Group(
        PARAM
        + Suppress(Literal(':'))
        + VALUE
    )
)

LINES = (
    OneOrMore(
        LINE
    )
).setResultsName('body')

SECTION = (
    Group(
        HEADER
        + LINES
    )
    .setResultsName('section')
)

GRAMMAR = OneOrMore(SECTION).setResultsName('section')

GRAMMAR.parseString(txt).asList()
对于
txt_1
,它可以正常工作,但是对于
txt_2
,它有两个单独的部分,其中第2部分的空行部分被视为第1部分

[['section1', ['key1', '1a'], ['section2', 'key2']]]
我用下面的令牌尝试了不同的方法,但没有成功

N = White('\n', exact=1)
EMPTY = LineStart()+LineEnd()

下面的代码利用了新的部分以模式“alphanum:alphanum:”开头的观察结果。反向前瞻
~
(NotAny)用于阻止
正文
解析器吞并下一节标题

setResultsName参数listAllMatches是为
结果名(
*
后缀)设置的,因此字典可以列出多个匹配项

PyPrScript默认情况下跳过空白,除非在某些情况下,例如使用组合时,所以这里不必考虑。

从pyparsing导入*
冒号=抑制(“:”)
param=单词(字母)(“param”)
值=单词(字母单位)(“值”)
行=组(参数+冒号+值)
新建部分检查=(单词(字母)+冒号)*2
正文=一个或多个(~新建部分检查+行(“行*”)
节=组(单词(字母)(“节”)+冒号+正文)
内容=一个或多个(节)
text=”“”
第1节:
关键词1:1a
第2节:
键2:2b
键3:3c
"""
打印(contents.parseString(text.dump())
这将产生以下结果:

['section1',['key1','1a']],['section2',['key2','2b'],['key3','3c']]
[0]:
['section1',['key1','1a']]
-行:['key1','1a']]
[0]:
['key1','1a']
-参数:“键1”
-值:“1a”
-节:'第1节'
[1]:
[section2'、[key2'、[Key2b']、[key3'、[3c']
-行:['key2','2b'],['key3','3c']]
[0]:
['key2','2b']
-参数:“键2”
-值:“2b”
[1]:
['key3','3c']
-参数:“键3”
-值:“3c”
-节:'第2节'

很好地使用负前瞻来检测新节何时开始。