python中的通用行语法分析器

python中的通用行语法分析器,python,parsing,Python,Parsing,问题是: 我正在寻找一个python库,它可能已经实现了我用另一种语言编写的文本解析器 我有几行文本表示设备中的配置命令或设备上运行的命令的动态输出。为了简单起见,我们假设每一行都是独立解析的。 底线是一行包含固定的关键字和值/变量/参数。有些关键字是可选的,有些关键字是强制性的,并按特定顺序排列。与给定关键字相关联/跟随给定关键字的变量/值的数量和类型可能因关键字而异 其他语言的解决方案: 我用C++编写了通用代码,它将解析任何一行,并将输入转换成结构化数据。代码的输入是 1.要分析的行和 2

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

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

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

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

我不确定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可能必须执行此类解析的任何功能或库的上下文中,能有一些具体的想法

谢谢,
Al.

如果我正确地理解了您的需求(我可能不理解,因为很难知道您对可能的语法有什么限制),那么您应该能够非常简单地通过标记器和每个命令的关键字解析器映射来解决这个问题

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

没有进行解析的标准库模块。有各种各样的第三方解析框架,但我认为它们对于您的需求来说可能过于苛刻(尽管我可能错了,即使您不需要那么复杂的东西,您也可能想要检查它们)。虽然我通常不主张手动滚动解析器,但这个特定的应用程序既简单到可以实现这一点,又与上下文无关语法的可能性有很大的不同,可以使直接编码变得有用


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

如果我正确理解您的需求(我可能不知道,因为很难知道您对可能的语法设置了什么限制),那么您应该能够非常简单地通过标记器和每个命令的关键字解析器映射来解决这个问题

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

没有标准的库模块来进行解析。有大量的第三方解析框架,但我认为它们对于您的需求来说可能过于苛刻了(尽管我可能错了,您可能想检查它们,即使您不需要那么复杂的东西).虽然我通常不主张手动滚动解析器,但这个特定的应用程序既简单到可以实现这一点,又与上下文无关语法的可能性有很大的不同,可以使直接编码变得有用

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

是解决您问题的好方法吗?如果不是,您可以编辑y吗