用关键字或纯文本匹配多行
Matching several lines with either keywords or plain text
import pyparsing as pp
pp.ParserElement.setDefaultWhitespaceChars(" \t")
# End of line. Clean it off.
NL = pp.LineEnd().suppress()
repeat_stmt = pp.Keyword("REPEAT") + pp.pyparsing_common.number()
end_stmt = pp.Keyword("END")
statement = (repeat_stmt | end_stmt)
text = pp.Group(~statement + pp.restOfLine)
structure = pp.ZeroOrMore(statement | text)
structure.ignore(NL)
DATA = """
line 1
line 2
a bit longer line 3
REPEAT 123
foo bar
END
"""
print(structure.parseString(DATA))
我正在尝试使用 pyparsing 构建相当简单的文本生成器。
鉴于上面的代码,我希望按原样复制非关键字行并解析关键字(目前所有两个)。
以上代码只以无限循环结束
我希望输出是这样的:
[
['line 2'], ['line 2'], ['a bit longer line 3'],
[['REPEAT', 123]], ['foo bar'] [['END'],
]
我怎样才能做到这一点?
如果使用 setDebug 启用 NL 解析调试,
NL = pp.LineEnd().suppress().setDebug()
您会看到 NL 在输入字符串的末尾永远循环。您可以在 ZeroOrMore 使用 stopOn:
时打破这个循环
structure = pp.ZeroOrMore(statement | text, stopOn=pp.StringEnd())
通过此更改,您将获得:
[['line 1'], ['line 2'], ['a bit longer line 3'], 'REPEAT', 123, ['foo bar'], 'END', ['']]
import pyparsing as pp
pp.ParserElement.setDefaultWhitespaceChars(" \t")
# End of line. Clean it off.
NL = pp.LineEnd().suppress()
repeat_stmt = pp.Keyword("REPEAT") + pp.pyparsing_common.number()
end_stmt = pp.Keyword("END")
statement = (repeat_stmt | end_stmt)
text = pp.Group(~statement + pp.restOfLine)
structure = pp.ZeroOrMore(statement | text)
structure.ignore(NL)
DATA = """
line 1
line 2
a bit longer line 3
REPEAT 123
foo bar
END
"""
print(structure.parseString(DATA))
我正在尝试使用 pyparsing 构建相当简单的文本生成器。
鉴于上面的代码,我希望按原样复制非关键字行并解析关键字(目前所有两个)。
以上代码只以无限循环结束
我希望输出是这样的:
[
['line 2'], ['line 2'], ['a bit longer line 3'],
[['REPEAT', 123]], ['foo bar'] [['END'],
]
我怎样才能做到这一点?
如果使用 setDebug 启用 NL 解析调试,
NL = pp.LineEnd().suppress().setDebug()
您会看到 NL 在输入字符串的末尾永远循环。您可以在 ZeroOrMore 使用 stopOn:
时打破这个循环structure = pp.ZeroOrMore(statement | text, stopOn=pp.StringEnd())
通过此更改,您将获得:
[['line 1'], ['line 2'], ['a bit longer line 3'], 'REPEAT', 123, ['foo bar'], 'END', ['']]