Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django按最多包含两个单词的CharField筛选对象_Django_String Matching - Fatal编程技术网

Django按最多包含两个单词的CharField筛选对象

Django按最多包含两个单词的CharField筛选对象,django,string-matching,Django,String Matching,我将所有用户搜索查询记录在如下模型中: class SearchLog(models.Model): query = models.CharField(max_length=512) datetime = models.DateTimeField(auto_now_add=True, db_index=True) 要获取最多包含一个单词的所有查询,我创建此查询集: SearchLog.objects.exclude(query__contains=" ") 我想得到最多两

我将所有用户搜索查询记录在如下模型中:

class SearchLog(models.Model):
     query = models.CharField(max_length=512)
     datetime = models.DateTimeField(auto_now_add=True, db_index=True)
要获取最多包含一个单词的所有查询,我创建此查询集:

SearchLog.objects.exclude(query__contains=" ")
我想得到最多两个单词的查询。即使使用原始sql,也有其他方法吗?

可以使用。这是您描述的文本模式

例如,要匹配最多两个单词,正则表达式可以如下所示:

^\S+(\s+\S+)?$
(但根据具体情况,您可能需要对其进行一些修改)

\S
代表非空格字符(即无空格、制表符、新行等)。我们重复这些字符一次或多次(使用
+
量词)。接下来,我们可以选择使用第二个单词(即末尾问号
的含义)。这个新词由一个或多个连续的空格字符(带
\s+
)和一个或多个非空格字符(带
\s+
)组成。插入符号(
^
)和美元(
$
)锚定表示字符串的开头和结尾(没有它,它将匹配至少有一个单词的任何内容)。如前所述,其中一个问题可能是您所看到的单词,因此根据该规范,您可能需要稍微更改正则表达式

例如,如果需要匹配完全没有单词的查询,我们必须将其更改为
^(\S+(\S+\S+)?$
,但是只有空格的字符串仍然不匹配。您可以看到,很难完全正确地获得模式,因为它基本上取决于您认为什么是“匹配”,什么不是

您可以使用来测试正则表达式。匹配的字符串是高亮显示的行。包含三个或更多单词的行不会突出显示,因此正则表达式将排除这些单词。您可以使用此工具测试正则表达式,并对其进行更改,直到它完全符合您的要求

因此,我们可以使用以下方法进行过滤:

SearchLog.objects.filter(query__regex=r'^\S+(\s+\S+)?$')
SearchLog.objects.filter(query\uu regex=r'^\S+(\S+\S+?$)

正则表达式能够执行相当高级的匹配。然而,在计算机科学中有一个著名的“正则语言的泵引理”,它规定了某些模式族不能写成正则表达式(事实上,有些模式族根本无法被任何程序匹配)。在这里,这并不重要(我认为),但regex本身无法匹配程序员心目中的任何模式。

是的,通过使用regex。哪个regex?如何称呼它呢?感谢您的详细回答和介绍regex101