2013-02-21 14 views
8

我正在尝试编写一个只能匹配整个单词的Django查询。基于答案here,我已经试过类似:只在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。

+0

您使用的数据库是? – Matt 2013-02-21 08:26:19

+0

@MattStevens,我正在使用PostgreSQL。 – GChorn 2013-02-21 08:29:24

回答

11

使用“”,而不是“\ b”当你使用PostgreSQL,这是因为Django的通过正则表达式直下到PostgreSQL - 让你的正则表达式的需要与之兼容。你应该可以在没有任何问题的情况下从psql执行它们。

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

参见:http://bit.ly/ZtpojU

+1

'\ y'究竟是什么? – 2013-02-21 08:54:15

+0

Django不会将PCRE转换为PostgreSQL正则表达式(请参阅:http://bit.ly/ZtpbgH)。所以你只需要使用PostgreSQL的原生正则表达式,请看这里:http://bit.ly/ZtpojU – Matt 2013-02-21 08:58:58

+0

这个工作。感谢您添加关于'\ y'的解释。至于''{0}'.format(stringVariable)'部分,这是写'%s'%stringVariable'的另一种方式吗?两者似乎都适合我。 – GChorn 2013-02-21 09:08:09

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的文档得到的东西。

我意识到这不是那么高雅(但如果你不是正则表达爱好者,可以方便维护)。

+1

因为这不会执行全字匹配;例如,如果我做了一个'text__contains ='tart''我拿起像'start'这样的结果。 – GChorn 2013-02-21 08:31:16

+0

我的坏 - 我显然不熟悉SQL足以知道'全字匹配'意味着某种特定的东西。无论如何,我已经更新了我的答案以改进一点。 – 2013-02-21 08:54:13

+0

易于维护?有很多你没有覆盖的情况('()',逗号等等)。 – 2013-02-21 08:56:11

0

我不得不尝试匹配使用Perl兼容的转义序列\乙字边界同样的问题。我的后端数据库是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() 
+0

这不会占用标点符号,所以你知道。 – yekta 2016-10-11 09:38:35