首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pyparsing解析F5 bigip.conf

如何使用pyparsing解析F5 bigip.conf
EN

Stack Overflow用户
提问于 2013-04-09 05:17:55
回答 1查看 3.5K关注 0票数 2

我正在尝试弄清楚如何使用这个漂亮的库来解析BigIP配置文件……语法应该是这样的:

代码语言:javascript
复制
stanza :: name { content }
name   :: several words, might contain alphas nums dot dash underscore or slash
content:: stanza OR ZeroOrMore(printable characters)

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

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

我是这样开始的:

代码语言:javascript
复制
from pyparsing import *
def parse(config):
    def BNF():
        """
        Example:
        ...
        ltm virtual /Common/vdi.uis.test.com_80_vs {
            destination /Common/1.2.3.4:80
            http-class {
                /Common/http2https
            }
            ip-protocol tcp
            mask 255.255.255.255
            profiles {
                /Common/http { }
                /Common/tcp { }
            }
            vlans-disabled
        }
        ...
        """        
        lcb, rcb, slash, dot, underscore, dash = [c for c in '{}/._-']
        name_word = Word(alphas + nums + dot + underscore + slash + dash)
        name = OneOrMore(name_word).setResultsName("name")
        stanza = Forward()
        content = OneOrMore(stanza | ZeroOrMore(OneOrMore(Word(printables)))).setResultsName("content")
        stanza << Group(name + lcb + content + rcb).setResultsName("stanza")
        return stanza


    return [x for x in BNF().scanString(config)]

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-09 22:35:37

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

此外,printable还包括一个右花括号,它由内容术语使用,不再适用于节。(如果您的内容可以包含右方括号,则需要定义一些东西来转义它,以区分内容方括号和节方括号。)

要解决名称规则,您需要另一个内容定义,一个不包含节的内容定义和一个“规则规则”。

代码语言:javascript
复制
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)]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15889170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档