pyparsing 条件解析器

1 投票
1 回答
548 浏览
提问于 2025-04-18 16:51

我需要解析以下三行内容:

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))

通过将一个解析元素声明为可选,你可以让解析器在这个元素不存在时跳过它,而不会出现任何错误。

撰写回答