5

少し前に、ウィキリークスが公開したケーブル用のBNF ベースの文法を書き始めました。しかし、私のアプローチはおそらく最善ではないことに気づき、改善を求めています。

ケーブルは 3 つの部分で構成されています。head にはRFC2822スタイルのフォーマットがあります。これは通常正しく解析されます。テキスト部分は、よりカジュアルな仕様になっています。たとえば、REFラインがあります。これは で始まるはずREF:ですが、異なるバージョンが見つかりました。次の正規表現は、ほとんどのケースをキャッチします: ^\s*[Rr][Ee][Ff][Ss: ]. そのため、前にスペースがあり、さまざまな場合があります。テキスト部分はほとんどがプレーン テキストで、特別な形式の見出しがいくつかあります。

各フィールド (日付、REF など) を認識し、データベースに入れたいと考えています。Pythons SimpleParse を選択しました。現時点では、認識できない各フィールドで解析が停止します。現在、よりフォールト トレラントなソリューションを探しています。すべてのフィールドには何らかの順序があります。パーサーがフィールドを認識しない場合、現在のフィールドに「認識されない」ブロブを追加して続行する必要があります。(または、ここでより良いアプローチがあるかもしれません)。

どのような種類のパーサーまたは他の種類のソリューションを提案しますか? 周りに何か良いものはありますか?

4

2 に答える 2

4

ケーブルマップはあなたが探していることをしているようです: http://pypi.python.org/pypi/cablemap.core/

于 2011-07-20T12:53:46.140 に答える
1

私はケーブルを見ていませんが、同様の問題を取り上げてオプションを考えてみましょう: RFC のパーサーを書きたいとしましょう。

厳密なパーサーを作成した場合、遭遇した状況に遭遇します - 異常値が進行を停止させます - この場合、2 つのオプションがあります:

  1. 厳密にフォーマットされているグループとそうでないグループの 2 つのグループに分けます。厳密なパーサーを作成して、ぶら下がっている成果が得られるようにし、外れ値の数に基づいて最適なオプション (手動処理、外れ値パーサーなど) を見つけ出します。

  2. 2 つのグループのサイズが等しい場合、または標準形式よりも外れ値が多い場合は、柔軟なパーサーを作成してください。この場合、正規表現は、一連の柔軟な正規表現を探してファイル全体を処理できるため、より有益です。正規表現の 1 つが失敗した場合、外れ値リストを簡単に生成できます。ただし、一連の正規表現に対して検索を行うことができるため、各正規表現の合格/不合格のマトリックスを作成できます。

フォーマットに従っているものとそうでないものがある「あいまいな」データの場合、私は正規表現のアプローチを使用することを好みます。それは私だけです。(はい、遅くなりますが、人間が生成した入力を処理する場合、すべてのコーナー ケースに適合する単一のクエリ (またはパーサー) を持つように、各一致セグメント間の関係を設計する必要があるのは悪夢です。

于 2011-07-05T07:20:52.057 に答える