全字匹配仅在Django查询中

时间:2013-02-21 08:22:28

标签: regex django django-queryset

我正在尝试编写一个只能匹配整个单词的Django查询。根据答案here,我尝试了类似的内容:

result = Model.objects.filter(text__iregex='\bsomeWord\b')

但这并没有返回预期的结果。我也试过

result = Model.objects.filter(text__iregex=r'\bsomeWord\b')

无济于事。我的最终目标是能够传入一个字符串变量,例如:

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

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

但是现在我甚至无法使用原始字符串。我正在使用PostgreSQL。

3 个答案:

答案 0 :(得分:16)

当你使用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-CONSTRAINT-ESCAPES-TABLE

答案 1 :(得分:1)

你可以通过删除正则表达式并使用一些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')

请参阅here了解文档。

我意识到这不是那么优雅(但如果你不是正则表达的粉丝那么便于维护)。

答案 2 :(得分:0)

我在使用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()