gpt4 book ai didi

python - python 中的通用行语法解析器

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:33 25 4
gpt4 key购买 nike

问题:我正在寻找一个 python 库,它可能已经实现了我用另一种语言编写的文本解析器。

我有几行文本,代表设备中的配置命令或设备上运行的命令的动态输出。为了简单起见,我们假设每一行都是独立解析的。最底线是一行包含固定的关键字和值/变量/参数。有些关键字是可选的,有些是强制性的,并且按特定顺序排列。与给定关键字相关联/跟随给定关键字的变量/值的数量和类型可以因一个关键字而异。

其他语言的解决方案:我用 C++ 编写了通用代码,可以解析任何行并将输入转换为结构化数据。代码的输入是1.要解析的行和2. 一个模型/结构,描述要查找的关键字、它们是否可选、它们可能出现的顺序以及每个关键字期望的值/变量类型(以及有多少个值/变量)。在 C++ 中,该接口(interface)允许用户提供一组用户定义的回调函数(每个关键字一个),由解析引擎调用以提供结果(与给定关键字关联的解析参数)。回调的实现是用户定义的,但回调签名是预先定义的。

Python 怎么样?我希望 python 中有一个简单的库(或者完全不同的方向,如果这是在 python 中做得不同/更好的话),它提供一个接口(interface)来指定给定行的语法/语法/模型(所有关键字的详细信息,它们的顺序,每个参数需要多少数量和类型),然后根据该语法解析输入行。

我不确定 argparse 有多适合我的需要,但这不是解析命令行输入,尽管类似。

一个例子:以下是来自 IP 网络世界的示例行,但问题更为普遍:访问列表 SOMENAME-IN 扩展允许 tcp 主机 117.21.212.54 主机 174.163.16.23 范围 5160 7000

上面一行中,关键字及其对应的参数是:

key: extended, no parameters
key: permit, no parameters
key: tcp, no parameters
key: host, par1: 117.21.212.54
key: host, par1: 174.163.16.23
key: range, par1: 5160, par2: 7000

这是防火墙访问控制列表 ACL 的一种形式。在这种情况下,解析器将用于填充指示的结构

- the name of the ACL (SOMENAME-IN in the above example)
- the type of ACL (extended in the above example but there are other valid keywords)
- the protocol (tcp in the above example)
- the src host/IP (117.21.212.54 in the example)
- the src port (optional and not present in the above example)
- the dst host/IP (174.163.16.23 in the example)
- the dst port (a range of ports from 5160 to 7000 in the above example)

人们可以很容易地编写一个专用的解析器,假设上面的示例特定语法并检查它(也许这也可能更有效,更清晰,因为针对特定语法),但我想要的是能够编写通用解析代码,其中所有关键字和预期语法作为数据/模型提供给解析引擎,解析引擎使用它来解析行,并且还能够指出解析行中的错误。

我显然并不是在寻找完整的解决方案,因为这会很多,但我希望在使用 python 和重用 python 可能必须执行此类解析的任何功能或库的上下文中得到具体的想法。

谢谢,阿尔。

最佳答案

如果我正确理解您的需求(而且我可能没有正确理解,因为很难知道您对可能的语法设置了哪些限制),那么您应该能够使用标记器相当简单地解决这个问题以及每个命令的关键字解析器映射。

如果您的需求非常简单,您可能可以使用 split 字符串方法进行标记,但您可能更喜欢至少处理带引号的字符串以及一些运算符符号的标记器。标准 Python 库为此提供了 shlex 模块。

没有标准库模块可以进行解析。有各种各样的第三方解析框架,但我认为它们可能无法满足您的需求(尽管我可能是错的,即使您不需要任何复杂的东西,您也可能想检查一下它们) )。虽然我通常不提倡手动滚动解析器,但这个特定的应用程序足够简单,足以使之成为可能,并且与上下文无关语法的可能性有足够的不同,使直接编码变得有用。

(上下文无关语法不切实际的原因是希望允许以任意顺序提供不同的命令选项,而不允许重复不可重复的选项。但是重读这个答案,我意识到这只是我的一个假设部分您需要该功能。)

关于python - python 中的通用行语法解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60288133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com