我試圖逃避Postgres的正則表達式查詢字符串яблуко*
:無效的正則表達式:無效的轉義序列,Postgres的,Django的
name = re.escape('яблуко*')
Model.objects.filter(name__iregex='^%s' % name)
這給了我:
無效的正則表達式:無效的轉義\序列
我在做什麼錯?
P.S.我知道,我可以做istartswith
它,只是想知道爲什麼正則表達式是行不通的。
我試圖逃避Postgres的正則表達式查詢字符串яблуко*
:無效的正則表達式:無效的轉義序列,Postgres的,Django的
name = re.escape('яблуко*')
Model.objects.filter(name__iregex='^%s' % name)
這給了我:
無效的正則表達式:無效的轉義\序列
我在做什麼錯?
P.S.我知道,我可以做istartswith
它,只是想知道爲什麼正則表達式是行不通的。
這裏的問題是,re.escape
不會逃避了太多的PostgreSQL的 - 它不逃避所有非ASCII字符,而PostgreSQL不支持轉義序列未知字符 - 在這種情況下,它的所有的Unicode字符:
>>> print re.escape('яблуко*')
\я\б\л\у\к\о\*
它到底是不是真的有可能與數據庫正則表達式引擎(評估)混合Python的正則表達式引擎(轉義)。不幸的是,Django並沒有提供這種方式。在Weblate,我已經通過編寫自定義函數逃脫正則表達式解決了這個,看https://github.com/WeblateOrg/weblate/commit/7425a749b44abafe36d8f1c9db018f57684e5983
問題在於Python正則表達式方言是PCRE的變體(https://stackoverflow.com/a/33908887/253599),PostgreSQL使用POSIX正則表達式(https://www.postgresql.org/docs /current/static/functions-matching.html)。此處引用的函數轉義的POSIX正則表達式的特殊字符,也NUL字符(雖然目前還不清楚,如果這是必需的)。 – Tyson
我無法重現你的錯誤。請包含完整的錯誤消息。 – DyZ
你爲什麼使用're.escape'?不應它只是'Model.objects.filter(name__iregex =r'яблуко*')'[每文檔](https://docs.djangoproject.com/en/1.11/ref/models/querysets/#iregex )?另外,如果在queryset篩選器之前打印它,「name」是什麼樣的? –
爲什麼不'name =r'яблуко*''?這個對我有用。 –