仅在Django查询中匹配整词



我正在尝试编写一个Django查询,它只匹配整个单词。根据这里的答案,我尝试了一些类似的东西:

result = Model.objects.filter(text__iregex='bsomeWordb')

但这并没有得到预期的结果。我也试过

result = Model.objects.filter(text__iregex=r'bsomeWordb')

但无济于事。我的最终目标是能够传递字符串变量,比如:

result = Model.objects.filter(text__iregex=r'b'+stringVariable+r'b')

result = Model.objects.filter(text__iregex=r'b %s b'%stringVariable)

但现在我甚至无法让它与一根未加工的绳子一起工作。我使用的是PostgreSQL。

在使用PostgreSQL时,请使用"\y"而不是"\b",这是因为Django将正则表达式直接传递给PostgreSQL,因此您的RegEx需要与之兼容。您应该能够从psql执行它们,而不会出现任何问题。

result = Model.objects.filter(text__iregex=r"y{0}y".format(stringVariable))

请参阅https://www.postgresql.org/docs/9.1/functions-matching.html#POSIX-约束-可缩放表

您可以通过删除regex并使用一些django查找来获得一些东西

result = Model.objects.filter(Q(text__contains=' someword ') |
                              Q(text__contains=' someword.') |
                              Q(text__istartswith = 'someword.' |
                              Q(text__istartswith = 'someword.' |
                              Q(text__iendswith = 'someword')

有关文档,请参阅此处。

我意识到这并不那么优雅(但如果你不是regex的粉丝,可以很容易地进行维护)。

我在尝试使用Perl兼容的转义序列\b匹配单词边界时遇到了同样的问题。我的后端数据库是MySQL。

我通过字符类表达式[[:space:]]解决了这个问题,例如

        q_sum = Q()
        search_list = self.form.cleaned_data['search_all'].split(' ');
        for search_item in search_list:
            search_regex = r"[[:space:]]%s[[:space:]]" % search_item
            q_sum |= Q(message__iregex=search_regex)
        queryset = BlogMessages.objects.filter(q_sum).distinct()

相关内容

  • 没有找到相关文章

最新更新