Python 无效的正则表达式:无效的escape\sequence、Postgres、Django
我正试图为Postgres正则表达式查询转义字符串Python 无效的正则表达式:无效的escape\sequence、Postgres、Django,python,django,postgresql,Python,Django,Postgresql,我正试图为Postgres正则表达式查询转义字符串 name = re.escape('яблуко*') Model.objects.filter(name__iregex='^%s' % name) 这给了我: 无效的正则表达式:无效的转义\序列 我做错了什么 另外,我知道我可以使用istartswith,只是想知道为什么正则表达式不工作。这里的问题是re.escape对PostgreSQL的转义太多了-它转义了所有非ASCII字符,虽然PostgreSQL不支持未知字符的转义序列,但在本
name = re.escape('яблуко*')
Model.objects.filter(name__iregex='^%s' % name)
这给了我:
无效的正则表达式:无效的转义\序列
我做错了什么
另外,我知道我可以使用istartswith
,只是想知道为什么正则表达式不工作。这里的问题是re.escape
对PostgreSQL的转义太多了-它转义了所有非ASCII字符,虽然PostgreSQL不支持未知字符的转义序列,但在本例中,它是所有unicode字符:
>>> print re.escape('яблуко*')
\я\б\л\у\к\о\*
最后,将Python regexp引擎(用于转义)与数据库regexp引擎(用于计算)混合使用是不可能的。不幸的是,Django没有提供这样做的方法。在中,我通过编写自定义函数来转义regexp解决了这个问题,请参见我无法重现您的错误。请包含完整的错误消息。为什么要使用re.escape
?它不应该是Model.objects.filter(name_uu-iregex=r'ббббббббб*)
?另外,如果在queryset筛选器之前打印,name
会是什么样子?为什么不打印name=r'ббббббö*'
?问题在于Python正则表达式方言是PCRE()的变体,而PostgreSQL使用POSIX正则表达式()。这里引用的函数转义POSIX正则表达式特殊字符,以及NUL字符(尽管不清楚是否需要)。