用于维基解密电缆的容错python解析器

时间:2011-05-15 08:02:22

标签: python parsing text-parsing bnf

前段时间我开始为BNF-based grammar撰写cables which WikiLeaks released。但是我现在意识到我的方法可能不是最好的,我正在寻找一些改进。

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

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

您会建议使用哪种解析器或其他类型的解决方案?有更好的事情吗?

2 个答案:

答案 0 :(得分:4)

Cablemap似乎可以执行您要搜索的内容:http://pypi.python.org/pypi/cablemap.core/

答案 1 :(得分:1)

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

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

  1. 将它们分成两组,严格格式化的组和非格式化的组。编写你的严格解析器,以便它得到最低限度的结果,并根据数字异常值找出最佳选项(手工处理,异常值解析器等)

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

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