python - 使用 pyparsing 解析类似 json 的结构

标签 python json parsing pyparsing

我尝试使用 pyparsing 解析以下结构:

{
    firewall {
        group {
            address-group {
                address 1.2.3.4
            }
            address-group {
                address 5.6.7.4
            }
        }
    }
}

代码:

from pyparsing import *

LBRACE, RBRACE = map(Suppress, "{}")

prop = Word(printables, excludeChars="{}\"")
numberValue = pyparsing_common.number()

configObject = Forward()
value = Forward()
value << (prop | numberValue | Group(configObject))
memberDef = Group(prop + value)
configMembers = delimitedList(memberDef)
configObject << Dict(LBRACE + Optional(configMembers) + RBRACE)

if __name__ == "__main__":
    testdata = """
    {
        firewall {
            group {
                address-group {
                    address 1.2.3.4
                }
                address-group {
                    address 1.2.3.4
                }
            }
        }
    }
    """


results = configObject.parseString(testdata)  

print(results.firewall.group)

它抛出

pyparsing.ParseException: Expected "}" (at char 15), (line:3, col:9)

如果我只有一个 address-group 它正在工作:

{
    firewall {
        group {
            address-group {
                address 1.2.3.4
            }
        }
    }
}

编辑:

{
    firewall {
        group {
            address-group {
                address 1.2.3.4
            }
            address-group {
                address 5.6.7.4
            }
        }
    }
}

使用 configMembers = OneOrMore(memberDef) 而不是 configMembers = delimitedList(memberDef) 来解决 我还需要解析它(注意 adress-group 之后的 name:

{
    firewall {
        group {
            address-group name1 {
                address 1.2.3.4
            }
            address-group name2 {
                address 5.6.7.4
            }
        }
    }
}

最佳答案

我在两个地址组之间添加了一个逗号,一切正常

{
firewall {
    group {
        address-group {
            address 1.2.3.4
        },
        address-group {
            address 5.6.7.4
        }
    }
}
}

因此代码是

from pyparsing import *

LBRACE, RBRACE = map(Suppress, "{}")

prop = Word(printables, excludeChars="{}\"")
numberValue = pyparsing_common.number()

configObject = Forward()
value = Forward()
value << (prop | numberValue | Group(configObject))
memberDef = Group(prop + value)
configMembers = delimitedList(memberDef)
configObject << Dict(LBRACE + Optional(configMembers) + RBRACE)

if __name__ == "__main__":
    testdata = """
    {
        firewall {
            group {
                address-group {
                    address 1.2.3.4
                },
                address-group {
                    address 5.6.7.4
                }
            }
        }
    }
    """


results = configObject.parseString(testdata)

print(results.firewall.group)

输出是

[['address-group', [['address', '1.2.3.4']]], ['address-group', [['address', 
'5.6.7.4']]]]

关于python - 使用 pyparsing 解析类似 json 的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088599/

相关文章:

ios - 是否有适用于 ios 的良好 CSV 解析器?

android - 发送带有参数的 JSON 对象时出现 JSON 解析错误

java - 跨平台 JSON 序列化

c# - 如何使用 MSpec 有效地测试固定长度的平面文件解析器?

Python——2.7 中没有的东西是 3.1 中的什么?很多东西都被向后移植了,什么不是?

python - 如何在 Sublime Text 2 插件中包含第三方 Python 包

javascript - zingcharts 使用时间作为多条线的 x 轴

json - 用flutter处理json中的空值

python - 如何使用 Python 删除部署到 Unified AI Platform 端点的模型?

python - 如何在 Python 中精确循环 N 次?