简体   繁体   English

pyparsing条件解析器

[英]pyparsing conditional parser

I need to parse the following three lines: 我需要解析以下三行:

Uptime is 1w2d
Last reset at 23:05:56
  Reason: reload

But last two lines are not always there, output could look like this prior to 1st reboot: 但是最后两行并不总是存在,在第一次重新启动之前,输出可能如下所示:

Uptime is 1w2d
Last reset

My parser looks like this: 我的解析器如下所示:

parser = SkipTo(Literal('is'), include=True)('uptime') +
         delimitedList(Suppress(SkipTo(Literal('at'), include=True))'(reset)' +
             SkipTo(Literal(':'), include=true) +
             SkipTo(lineEnd)('reason'), combine=True)
         )

It works in first case with 3 lines, but doesnt work with second case. 它在第一种情况下具有3行,但在第二种情况下不起作用。

I will use for the file that you've reported this syntax (supposing that the order is relevant): 我将使用您报告此语法的文件(假设顺序相关):

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

Declaring a parsing element optional you are able to let the parser skip it when it is not present, without raising any errors. 声明一个解析元素是可选的,您可以让解析器在不存在时跳过它,而不会引起任何错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM