我尝试使用基于以下代码的"indentedBlock“:
import pyparsing as pp
import pprint
class Parser(object):
def __init__(self):
indentStack = [1]
stmt = pp.Forward()
start = pp.Word(pp.alphanums + "/" + "\." + "-" + ":" + "!" + "*"+" ")
funcDecl = (pp.OneOrMore(start)+ pp.restOfLine)
func_body = pp.indentedBlock(stmt, indentStack)
funcDef = pp.Group(funcDecl + func_body)
stmt << (funcDef)
self.__parser = pp.OneOrMore(stmt)
def parse(self, line):
try:
res = self.__parser.parseString(line)
pprint.pprint(res)
print("done")
except pp.ParseException as x:
print(x)在应用之后,我得到了以下错误:
预期W:(ABCD...)(在char 226),(第6行,第37列)
主要内容如下:
if __name__ == "__main__":
parser = Parser()
test = """first level config parameter 1-n
second level config parameter 1-n
thirt level config parameter 1-n
second level config parameter 1-n
thirt level config parameter 1-n
first level config parameter 1-n"""
print(test)
parser.parse(test)你知道哪里出了问题吗?
发布于 2018-12-14 12:17:15
对于pyparsing来说,对空格敏感的解析总是一个挑战,因为它的默认行为是跳过空格。此外,将表达式定义为有效字符包括' '的Word通常是自找麻烦。但是因为它被包装在一个indentedBlock中(它将负责在正确的位置查找换行符),所以您可以在这里使用它。
我扩展了您的测试字符串,使其包含一些空行和一些多行块,并提出了以下内容:
import pyparsing as pp
test = """\
first level config parameter 1-n
second level config parameter 1-n
thirt level config parameter 1-n
thirt level config parameter n+1-m
second level config parameter 1-n
thirt level config parameter 1-n
first level config parameter 1-n"""
import pyparsing as pp
indent_stack = [1]
func_body = pp.Forward()
# what you had as `start` looks like pretty much just any line of characters
stmt = pp.Word(pp.printables + " ")
func_body <<= pp.Group(stmt + pp.indentedBlock(func_body | stmt, indent_stack))
# parse your sample text and output results with pprint
pp.OneOrMore(func_body | pp.Group(stmt)).parseString(test).pprint()提供:
[['first level config parameter 1-n',
[[['second level config parameter 1-n',
[['thirt level config parameter 1-n'],
['thirt level config parameter n+1-m']]]],
[['second level config parameter 1-n',
[['thirt level config parameter 1-n']]]]]],
['first level config parameter 1-n']]https://stackoverflow.com/questions/53758063
复制相似问题