2017-09-06 1 views
3

Ich versuche, eine Zeichenfolge яблуко* für Postgres regex Abfrage zu entkommen:Ungültiger regulärer Ausdruck: ungültige Escape Sequenz, Postgres, Django

name = re.escape('яблуко*') 
Model.objects.filter(name__iregex='^%s' % name) 

Das gibt mir:

Ungültiger regulärer Ausdruck: Ungültige Escape \ Sequenz

Was mache ich falsch?

P.S. Ich weiß, dass ich es mit istartswith tun kann, nur wundernd, warum Regex nicht funktioniert.

+0

Ich kann Ihren Fehler nicht reproduzieren. Bitte fügen Sie die vollständige Fehlermeldung hinzu. – DyZ

+0

Warum benutzen Sie 're.escape' überhaupt? Sollte es nicht einfach "Model.objects.filter (name__iregex = r'яблуко * ')" [nach den Dokumenten] sein (https://docs.djangoproject.com/en/1.11/ref/models/querysets/#iregex) Wie sieht "name" aus, wenn Sie es vor dem Filter "queryset" drucken? –

+2

warum nicht 'name = r'яблуко * ''? Für mich geht das. –

Antwort

1

Das Problem hier ist, dass re.escape für PostgreSQL viel zu viel nicht entkommen - es alle nicht ASCII-Zeichen nicht entkommen, während PostgreSQL nicht Escape-Sequenzen für unbekannte Zeichen unterstützen - in diesem Fall sind es die alle Unicode-Zeichen:

>>> print re.escape('яблуко*') 
\я\б\л\у\к\о\* 

Am Ende ist es nicht wirklich möglich, Python Regexp-Engine (für das Escaping) mit Datenbank Regexp-Engine (zur Auswertung) zu mischen. Leider bietet Django keine Möglichkeit, dies zu tun. In Weblate, habe ich dies gelöst, indem ich benutzerdefinierte Funktion schreiben, um die Regexp zu entkommen, siehe https://github.com/WeblateOrg/weblate/commit/7425a749b44abafe36d8f1c9db018f57684e5983

+0

Das Problem ist mehr, dass der Python-Dialekt für reguläre Ausdrücke eine Variante von PCRE ist (https://Stackoverflow.com/a/33908887/253599) und dass PostgreSQL reguläre POSIX-Ausdrücke verwendet (https://www.postgresql.org/docs) /current/static/functions-matching.html). Die Funktion, auf die hier verwiesen wird, entzieht den speziellen POSIX-Sonderzeichen und dem NUL-Zeichen (obwohl es unklar ist, ob dies erforderlich ist). – Tyson

Verwandte Themen