0

説明するのは非常に困難ですが (特にネイティブ スピーカーではない場合)、最善を尽くします。

私のpythonプログラムには、たとえば、ニュース記事のデータベースと、それらのサブセットについて通知されたいユーザーの1人がいます。すべてのニュース オブジェクトには、 AuthorTitleTextなどの複数の文字列があります。

ユーザーの興味を式として保存して、さまざまな文字列属性を照合し、それらの一致を次のような論理演算子と組み合わせることができるようにしたいと考えています (構文は実際には問題ではありません)。

attribute author matches pattern (\w*\sSmith) and attribute text doesn't
contain pattern (financ(e|ial))

次に、すべてのユーザーについて、すべての記事を反復処理し、式が有効な場合はユーザーに通知する必要があります。

私の問題は、どの言語を使用すればよいか本当にわからないことです。これはかなり一般的な問題であり、私よりも優れた解決策が必要であると確信しているため、独自のパーサーを作成したり、通常の問題 (セキュリティ、エスケープなど) をすべて使用して独自のパーサーを作成したりすることは避けたいと思います。作成することができます。

しばらくウェブを検索しましたが、何も見つかりませんでした。すべてのヘルプは非常に高く評価されています。前もって感謝します!

[編集:] RabbidRabbit が提案したように擬似コードを再フォーマットします。

4

1 に答える 1

1

この問題にアプローチするには、いくつかの方法があります。(attribute, regexp)それらは、オブジェクトごとに適用するタプルのリストから、より複雑なものまでさまざまです。

1つのオプションは、あなたが言及したような単純なクエリを指定できる、ある種の宣言的な「言語」を見つけることです。これは、JSON または YAML 構造に格納されるものである可能性があります。それはすべて、必要とする複雑さ/拡張性に依存します。

本当に拡張可能にしたい場合は、DSL (ドメイン固有言語) が必要になる場合があります。

http://www.slideshare.net/Siddhi/creating-domain-specific-languages-in-python

役立つかもしれない過去の StackOverflow 投稿を次に示します。

テーブルから行を選択するためのドメイン固有言語を作成する

私が見ることができる最も簡単な解決策 (解析、生成、および保存) は、次のようなタプルの LISP スタイルのプレフィックス リストです。

[('and', ('body', '.*to be or not.*'), ('author', (not, '.*shakespeare.*'))),
 ...]

基本的なブール演算子と正規表現だけが必要な場合は、それで十分です。

[編集]例を追加

于 2012-05-14T16:34:29.427 に答える