2

これが私の質問です。
私は正規表現のリストを持つモデルを持っています

|__Field_|  
| (\w+)  |  
| ([op]+)|  
| .*     |  
| others.|  


たとえば、(「猫」、「犬」、「オオカミ」) という単語のリストがあり、モデルに保存されている正規表現のうち、リスト内の単語 (または複数の単語) と一致するものを見つける必要があります...逆 __regexp フィルターのように。
この機能を実現するにはどうすればよいですか?

そのようなことをするより良い方法はありますか?

ありがとう!

4

2 に答える 2

3

次の 2 つの重要事項が指定されていません。

  • どのデータベースを使用していますか?
  • PCRE 正規表現と POSIX 正規表現を切り替えることができますか?

正規表現を使用してクエリを実行できるデータベースを使用していて、データベースが必要な標準 (PCRE/POSIX) をサポートしていると仮定すると、 extra() クエリセット修飾子__regexを使用して逆フィルター処理できます。以下のコードを見てください。

Model.objects.extra(where=[sql_regex('REGEX_COLUMN')], params=['TEXT TO MATCH']).all()

コードsql_regex()は次のようなものです。

from django.db import backend

def sql_regex(column, type='regex'):
    op = backend.DatabaseWrapper.operators[type].replace('%s', column)
    return '%s ' + op

以前backend.DatabaseWrapper.operators[type]は、データベース バックエンドに格納されている正規表現をクエリするための事前定義されたパターンを取得していました。

于 2012-05-18T20:02:00.603 に答える
1

@DrTyrsaがコメントしているように、各ケースをループする以外に、これを行う「方法」があるとは思えません。

ただし、パフォーマンスが懸念される場合は、いくつかの最適化を行うことができると思います。たとえば、多くの正規表現\w\w+(つまり、2 文字以上の単語) があるとします。「cat」や「1234」などの各単語を just に対してチェックできます\w\w+。単語が一致しない場合は、残りの正規表現をわざわざ実行する必要はありません。それらはすべてそれに依存しているためです。 1 つのコンポーネント。

もちろん、ゼロを受け入れる量指定子?*、および{}、および代替演算子|は、正規表現を正規表現して を除外しない限り、この特定のアイデアを不可能にします^[^?*{}]+$。しかし今、私たちはばかげているだけです。このような「最適化」を実装するために一種の「正規表現階層」が必要になるのは、すでにおかしな話です。他の人がより実用的な最適化を考え出すことができると思います。

幸運を。

于 2012-05-18T14:52:09.617 に答える