5

前段时间,我开始为WikiLeaks 发布的电缆编写基于BNF 的语法。但是我现在意识到我的方法可能不是最好的,我正在寻找一些改进。

一个机箱由三部分组成。头部有一些RFC2822风格的格式。这解析通常是正确的。文本部分有一个更非正式的规范。例如,有一条REF线。这应该以 开头REF:,但我发现了不同的版本。以下正则表达式捕获大多数情况:^\s*[Rr][Ee][Ff][Ss: ]. 所以前面有空格,不同的情况等等。文本部分主要是带有一些特殊格式标题的纯文本。

我们要识别每个字段(日期、REF 等)并放入数据库。我们选择了 Python 的 SimpleParse。目前,解析在它无法识别的每个字段处停止。我们现在正在寻找更容错的解决方案。所有字段都有某种顺序。当解析器无法识别某个字段时,它应该在当前字段中添加一些“未识别”-blob 并继续。(或者也许你在这里有一些更好的方法)。

你会建议什么样的解析器或其他类型的解决方案?周围有更好的吗?

4

2 回答 2

4

Cablemap 似乎可以满足您的需求:http ://pypi.python.org/pypi/cablemap.core/

于 2011-07-20T12:53:46.140 回答
1

我没有看过电缆,但让我们考虑一个类似的问题并考虑选项:假设您想为 RFC 编写一个解析器,有一个用于格式化 RFC 的 RFC,但并非所有 RFC 都遵循它。

如果你编写了一个严格的解析器,你会遇到你遇到的情况——异常值会阻止你的进度——在这种情况下,你有两个选择:

  1. 将它们分成两组,一组是严格格式化的,另一组不是。编写您的严格解析器,以便它获得低悬的果实,并根据异常值的数量找出最佳选择是什么(手动处理、异常值解析器等)

  2. 如果两组大小相同,或者异常值多于标准格式 - 编写一个灵活的解析器。在这种情况下,正则表达式将对您更有利,因为您可以处理整个文件以寻找一系列灵活的正则表达式,如果其中一个正则表达式失败,您可以轻松生成异常值列表。但是,由于您可以针对一系列正则表达式进行搜索,因此您可以为每个正则表达式构建一个通过/失败矩阵。

对于有些遵循格式而有些不遵循格式的“模糊”数据,我更喜欢使用正则表达式方法。但这只是我。(是的,它比较慢,但是在处理人工生成的输入时,必须设计每个匹配段之间的关系,以便您有一个适合每个极端情况的查询(或解析器)是一场噩梦。

于 2011-07-05T07:20:52.057 回答