12

我正在尝试编写一个仅匹配整个单词的 Django 查询。根据此处的答案,我尝试过类似的方法:

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。

4

3 回答 3

25

当你使用 PostgreSQL 时,使用“<strong>\y”而不是“<strong>\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

于 2013-02-21T08:53:26.263 回答
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()
于 2013-07-27T19:43:56.933 回答
0

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

有关文档,请参见此处

我意识到这不是那么优雅(但如果您不喜欢正则表达式,则可以轻松维护)。

于 2013-02-21T08:26:57.030 回答