2011-05-15 62 views
5

前段時間我開始爲cables which WikiLeaks released寫一個BNF-based grammar。但是我現在意識到我的方法可能不是最好的,我正在尋求一些改進。維基解密電纜的容錯python解析器

cabe由三部分組成。頭部有一些RFC2822樣式的格式。這通常解析正確。文本部分有一個非正式的規範。例如,有一個REF -line。這應該從REF:開始,但是我找到了不同的版本。以下正則表達式捕獲大多數情況:^\s*[Rr][Ee][Ff][Ss: ]。所以前面有空格,不同的例子等等。文本部分大多是純文本,並帶有一些特殊的格式標題。

我們想識別每個字段(日期,REF等)並將其放入數據庫。我們選擇了Pythons SimpleParse。目前,解析在每個無法識別的字段處停止。我們現在正在尋找更容錯的解決方案。所有領域都有某種秩序。當解析器不能識別某個字段時,它應該在當前字段中添加一些「not recognized」blob並繼續。 (或者,也許你在這裏有更好的方法)。

你會建議什麼樣的解析器或其他類型的解決方案?周圍有更好的東西嗎?

+1

你確定你需要一個解析器嗎?你所描述的電纜結構聽起來像一個3型語言(在喬姆斯基的分類中),這將暗示一個詞法分析器flex)或正則表達式是「解析」電纜的手段 – phynfo 2011-05-15 08:28:10

+0

爲什麼不在每個標頭標記中添加'/ not_recognized'? – 2011-05-15 09:59:36

+0

我不確定是否真的需要解析器,從我的印象來看,解析器輸入更多可讀性比正則表達式多,所以我十歲戴爾贊成它。我會看看flex。 – qbi 2011-05-15 11:45:03

回答

1

我沒有看過電纜,但讓我們看看類似的問題,並考慮以下選項:假設您想爲RFC編寫一個解析器,有一個用於RFC格式化的RFC,但並非所有RFC都遵循它。

如果你寫了一個嚴格的解析器,你會碰到你碰到的情況 - 該異常將停止你的進步 - 在這種情況下,你有兩個選擇:

  1. 其拆分分成兩組,一組嚴格格式化,另一組不是。寫出嚴格的解析器,使其得到低掛果,並根據數字異常值計算出最佳選項(手工處理,異常解析器等)

  2. 如果兩組的大小相同,或者存在比標準格式更離羣 - 編寫靈活的解析器。在這種情況下,正則表達式會對您更有利,因爲您可以處理整個文件來查找一系列靈活的正則表達式,如果其中一個正則表達式失敗,您可以輕鬆生成異常列表。但是,由於您可以對一系列正則表達式進行搜索,因此可以爲每個正則表達式構建一個合格/不合格矩陣。

對於'模糊'數據,其中一些遵循格式,另一些不遵循格式,我更喜歡使用正則表達式方法。這只是我而已。 (是的,速度較慢,但​​必須設計每個匹配段之間的關係,以便您有適合每個角落案例的單個查詢(或解析器),這是處理人類生成輸入時的噩夢。