2016-11-14 9 views
0

globパターンを使用してdbのクエリを実行する際に問題が発生しました。globパターンを使用してDBにクエリを実行できますか?

私はglobが正規表現に変換されるかもしれないと思っています。私はI can query db using regexを知っています。に変換シェルスタイルのパターンfnmatch.translate(パターン)

戻り

translate

私はその翻訳に自分自身を行っていたが、私はPythonはちょうどそれを行うに fnmatchを有することを見出し、明示的に機能re.match()で使用するための正規表現。

だから、私は、エラーメッセージを理解していないの両方のものが、...

>>> from vte.models import VTE 
>>> import fnmatch 
>>> regex = fnmatch.translate('19*') 
>>> regex 
'19.*\\Z(?ms)' 
>>> VTE.objects.filter(ipaddr__regex=regex) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 234, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__ 
    self._fetch_all() 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all 
    self._result_cache = list(self.iterator()) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__ 
    results = compiler.execute_sql() 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 848, in execute_sql 
    cursor.execute(sql, params) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/var/www/vtfx/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
DataError: invalid regular expression: quantifier operand invalid 

を組み合わせることを試みました。

は、PostgreSQLに翻訳されなければならないDjangoのドキュメント、(ちなみに私が使用しているデシベル、)この

SELECT ... WHERE ipaddr ~ '19.*\\Z(?ms)'; 

Here it is the ~ operator documentation.

のようなものによると、だから私は、正規表現を少し変えてみましたtranslate()によって返され、?文字を削除するときにエラーをスローしません。

次にglob->正規表現の翻訳が最後の部分なしでうまくいくと思ったかもしれませんが\\Z(?ms)ですが、私は何か不足しているかもしれません。

要約:

  • これは、これは私が19.*

だから、新しいコードはこの

ようになると予想通り、これはうまくいくと思うエラー 19.*\\Z(ms)
  • をスローしませんエラー19.*\\Z(?ms)
  • をスローします
    >>> VTE.objects.filter(ipaddr__regex=regex.replace('\\Z(?ms)', '')) 
    [<VTE: 192.168.56.100>] 
    

    .replace('\\Z(?ms)', '')を実行すると、何が欠けていますか?それはなぜ必要なのですか?これは良い解決策ですか?私の質問のコメントに基づいて

  • +1

    グロブ表現を* Python *正規表現に変換する 'fnmatch'はしませんか?誰でも正規表現の構文は少し異なりますが、サポートされる機能も異なります。私は '(?ms)'が正規表現に '/ m'と'/s'オプションを適用しようとしており、PostgreSQLは '(?...)'をサポートしていないと思います。あなたが探している(PostgreSQL)正規表現はちょうど ''19。* ''です。私はあなたのための答えを持っていないので、Pythonの人ではなく、ちょうどいくつかの出発点。 –

    +0

    ニース、それは確かに非常に役立った。また、 '\\ Z'は' $ '(行末)と同じように見えるので、この' .replace( '\\ Z(?ms)'、 '$') 'のように置き換えてください。正規表現は(私が思う) ''19でなければなりません。* $ '' – jperelli

    +1

    一部の正規表現エンジンは、' \ A'と同様に' \ Z'(または '\ z')と' $ 'の両方を持つことによって文字列の終わりと行末を区別します。そして行頭。 –

    答えて

    0

    が、私は以下の

    import fnmatch 
    globex = ...... 
    regex = '^{}'.format(fnmatch.translate(globex).replace('\\Z(?ms)', '$')) 
    VTE.objects.filter(ipaddr__regex=regex) 
    

    をやってしまったこれは、PostgreSQLとJavaScriptの正規表現の実装と互換性があるように思われます。

    関連する問題