无效的正则表达式:无效的escape \ sequence,Postgres,Django

时间:2017-09-06 19:50:26

标签: python django postgresql

我正在尝试为Postgres正则表达式查询转义字符串яблуко*

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

这给了我:

  

无效的正则表达式:无效的escape \ sequence

我做错了什么?

P.S。我知道我可以用istartswith来做,只是想知道为什么正则表达式不起作用。

1 个答案:

答案 0 :(得分:2)

这里的问题是re.escape对PostgreSQL来说太过分了 - 它确实逃脱了所有非ASCII字符,而PostgreSQL不支持未知字符的转义序列 - 在这种情况下它是'所有的unicode字符:

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

最后,实际上不可能将Python regexp引擎(用于转义)与数据库regexp引擎(用于评估)混合使用。不幸的是,Django并没有提供这样做的方法。在Weblate中,我通过编写自定义函数来解决此问题以逃避正则表达式,请参阅https://github.com/WeblateOrg/weblate/commit/7425a749b44abafe36d8f1c9db018f57684e5983