pyparse:如何处理{foo bar\n}格式的流?

2024-04-19 02:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有人能指出一种让pyparse处理以下数据流的方法:

"text { \n line1 line1\n line2 line2\n \n }"

其中大括号之间的信息只是一个字符串块,以便以后进一步解析。我所能做到的最好的方法就是使用带有failOn属性的skipTo。你知道吗

line = SkipTo(LineEnd(), failOn=(LineStart()+LineEnd())|'}') + LineEnd().suppress() 
nxos_clause = "with" + output_file + "{"  + OneOrMore(line.setDebug()) + "}"

调试节目

Match {SkipTo:(LineEnd) Suppress:(LineEnd)} at loc 76(4,1)
Exception raised:Found expression {{LineStart LineEnd} | "}"} (at char 94), (line:4, col:19)
(1, 'failed parse:', 'Expected "}" (at char 77), (line:4, col:2)')

我想要的结果是

"{", "line1 line1", "line2 line2", "}"

我知道手工操作非常简单。我正在寻找建立一个更复杂的语法一旦我得到简单的东西工作。。。你知道吗


Tags: 方法textlinecol大括号at数据流char
1条回答
网友
1楼 · 发布于 2024-04-19 02:17:34

如果换行符很重要,则需要从默认空白字符的pyparsing集中删除它们。你知道吗

from pyparsing import *
ParserElement.setDefaultWhitespaceChars(' ')

要抑制空行,请定义与空行匹配的表达式,然后在测试与可能包含内容的行匹配的表达式之前,对空行进行匹配和抑制:

test = "text { \n line1 line1\n line2 line2\n \n }"
NL = LineEnd().suppress()

LBRACE,RBRACE = map(Literal, "{}")
emptyLine = Suppress(Empty() + NL)
line = SkipTo(NL) + NL
nxos_clause = "text" + LBRACE + OneOrMore(~RBRACE + (emptyLine | line)) + RBRACE

另外,请注意,我们必须在OneOrMore中向前看,以免将右大括号作为有效的非空行处理。你知道吗

现在分析整个输入行:

print nxos_clause.parseString(test)

提供:

['text', '{', 'line1 line1', 'line2 line2', '}']

相关问题 更多 >