2017-09-06 61 views
3

我試圖逃避Postgres的正則表達式查詢字符串яблуко*無效的正則表達式:無效的轉義序列,Postgres的,Django的

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

這給了我:

無效的正則表達式:無效的轉義\序列

我在做什麼錯?

P.S.我知道,我可以做istartswith它,只是想知道爲什麼正則表達式是行不通的。

+0

我無法重現你的錯誤。請包含完整的錯誤消息。 – DyZ

+0

你爲什麼使用're.escape'?不應它只是'Model.objects.filter(name__iregex =r'яблуко*')'[每文檔](https://docs.djangoproject.com/en/1.11/ref/models/querysets/#iregex )?另外,如果在queryset篩選器之前打印它,「name」是什麼樣的? –

+2

爲什麼不'name =r'яблуко*''?這個對我有用。 –

回答

1

這裏的問題是,re.escape不會逃避了太多的PostgreSQL的 - 它不逃避所有非ASCII字符,而PostgreSQL不支持轉義序列未知字符 - 在這種情況下,它的所有的Unicode字符:

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

它到底是不是真的有可能與數據庫正則表達式引擎(評估)混合Python的正則表達式引擎(轉義)。不幸的是,Django並沒有提供這種方式。在Weblate,我已經通過編寫自定義函數逃脫正則表達式解決了這個,看https://github.com/WeblateOrg/weblate/commit/7425a749b44abafe36d8f1c9db018f57684e5983

+0

問題在於Python正則表達式方言是PCRE的變體(https://stackoverflow.com/a/33908887/253599),PostgreSQL使用POSIX正則表達式(https://www.postgresql.org/docs /current/static/functions-matching.html)。此處引用的函數轉義的POSIX正則表達式的特殊字符,也NUL字符(雖然目前還不清楚,如果這是必需的)。 – Tyson

相關問題