如何解析F5必和必拓使用pyparsing

2024-05-15 07:13:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图找出如何使用这个漂亮的库来解析BigIP配置文件。。。 语法应该是这样的:

stanza :: name { content }
name   :: several words, might contain alphas nums dot dash underscore or slash
content:: stanza OR ZeroOrMore(printable characters)

为了让事情稍微复杂一点,有一个例外:

如果名称以“rule”开头,则内容不能为“stanza”

我从这个开始:

^{pr2}$

上面的代码似乎锁定在某个无限循环中。如果“name”以“rule”开头,那么它也缺少了排除查找“stanza”的要求。在


Tags: name配置文件语法contentruledotwordsmight
1条回答
网友
1楼 · 发布于 2024-05-15 07:13:29

OneOrMore(ZeroOrMore(OneOrMore(Word(printables)))将始终匹配,从而导致无限循环。在

另外,printables还包括一个右大括号,它被内容项使用,不再适用于节。(如果您的内容可以包含右括号,则需要定义对其进行转义的内容,以区分内容括号和节括号。)

要处理名称规则,您需要另一个内容定义,一个不包括节的内容定义和一个“规则规则”。在

def parse(config):
    def BNF():
        lcb, rcb, slash, dot, underscore, dash = [c for c in '{}/._-']
        printables_no_rcb = Word(printables, excludeChars=rcb)
        name_word = Word(alphas + nums + dot + underscore + slash + dash)
        name = OneOrMore(name_word).setResultsName("name")
        rule = Group(Literal('rule') + name).setResultsName("name")
        rule_content = OneOrMore(printables_no_rcb).setResultsName("content")
        stanza = Forward()
        content = OneOrMore(stanza | OneOrMore(printables_no_rcb)).setResultsName("content")
        stanza << Group(rule + lcb + rule_content + rcb | name + lcb + content + rcb).setResultsName("stanza")
        return stanza
    return [x for x in BNF().scanString(config)]

相关问题 更多 >