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节'
很好地使用负前瞻来检测新节何时开始。