- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题:我正在寻找一个 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/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!