pyparsing 条件解析器
我需要解析以下三行内容:
Uptime is 1w2d
Last reset at 23:05:56
Reason: reload
但是最后两行并不总是存在,输出在第一次重启之前可能看起来像这样:
Uptime is 1w2d
Last reset
我的解析器是这样的:
parser = SkipTo(Literal('is'), include=True)('uptime') +
delimitedList(Suppress(SkipTo(Literal('at'), include=True))'(reset)' +
SkipTo(Literal(':'), include=true) +
SkipTo(lineEnd)('reason'), combine=True)
)
在第一种情况下有三行时,它能正常工作,但在第二种情况下就不行了。
1 个回答
2
我会使用你提到的这个文件语法(假设顺序很重要):
from pyparsing import Literal, Word, alphanums, nums, alphas, Optional, delimitedList
def createParser():
firstLine = Literal('Uptime is') + Word(alphanums)
secLine = Literal('Last reset at') + delimitedList(Word(nums) + Literal(':') + Word(nums) + Literal(':') + Word(nums))
thirdLine = Literal('Reason:') + Word(alphas)
return firstLine + secLine + Optional(thirdLine)
if __name__ == '__main__':
parser = createParser()
firstText = """Uptime is 1w2d\n
Last reset at 23:05:56\n
Reason: reload"""
print(parser.parseString(firstText))
通过将一个解析元素声明为可选,你可以让解析器在这个元素不存在时跳过它,而不会出现任何错误。