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