Замечание о том, что новый раздел начинается с шаблона " alphanum: alphanum: ", используется в приведенном ниже коде. Отрицательный взгляд ~
( NotAny ) используется, чтобы не дать парсеру body
сожрать заголовок следующего раздела.
Параметр setResultsName listAllMatches задается для имени результата line
(суффикс *
), так что в словаре может отображаться несколько совпадений.
pyparsing по умолчанию пропускает пробел, за исключением определенных ситуаций, например, при использовании Combine , поэтому здесь нет необходимости его рассматривать.
from pyparsing import *
COLON = Suppress(':')
param = Word(alphanums)("param")
value = Word(alphanums)("value")
line = Group(param + COLON + value)
new_section_check = (Word(alphanums) + COLON) * 2
body = OneOrMore(~new_section_check + line("line*"))
section = Group(Word(alphanums)("section") + COLON + body)
contents = OneOrMore(section)
text = """
section1:
key1: 1a
section2:
key2: 2b
key3: 3c
"""
print(contents.parseString(text).dump())
, который производит следующее:
[['section1', ['key1', '1a']], ['section2', ['key2', '2b'], ['key3', '3c']]]
[0]:
['section1', ['key1', '1a']]
- line: [['key1', '1a']]
[0]:
['key1', '1a']
- param: 'key1'
- value: '1a'
- section: 'section1'
[1]:
['section2', ['key2', '2b'], ['key3', '3c']]
- line: [['key2', '2b'], ['key3', '3c']]
[0]:
['key2', '2b']
- param: 'key2'
- value: '2b'
[1]:
['key3', '3c']
- param: 'key3'
- value: '3c'
- section: 'section2'