python 重新工作时,django 过滤器正则表达式不工作

djagno filter regex not working while python re works

我正在尝试在 django 中为 正则表达式

进行 iregex 匹配
reg_string = (\w|\d|\b|\s)+h(\w|\d|\b|\s)+(\w|\d|\b|\s)+anto(\w|\d|\b|\s)+
self.queryset.filter(name__iregex=r"%s"%(reg_string,))

通过使用单词 "The Canton" 作为名称 但它不返回任何值,但在 python [=26] 中使用它时=] 正常工作

print (re.search(r'(\w|\d|\b|\s)+h(\w|\d|\b|\s)+(\w|\d|\b|\s)+anto(\w|\d|\b|\s)+', 'The Canton', re.I).group()

我正在使用 Mysql 5.7,有人知道如何解决这个问题

请注意,MySQL REGEXP 不支持 shorthand 字符 class,例如 \s\d\w等。它支持一些基本的 POSIX 字符 class,例如 [:digit:][:alpha:][:alnum:]

即使您继续使用 Python 中的模式,您也不应编写 (\w|\d|\b|\s)+,因为它匹配并捕获单个字符,即单词字符或数字、单词边界或空格, 1 次或多次(并用引擎匹配的最新字符重写 N 组的缓冲区)。您可以用单个字符重写它 class - [\w\s]+.

现在,您在 MySQL 中的模式将如下所示

[_[:alnum:][:space:]]+h[_[:alnum:][:space:]]+anto[_[:alnum:]‌​[:space:]]+

其中 [\w\s]+ 变成 [_[:alnum:][:space:]]+:

  • [ - 括号表达式的开始
  • _ - 下划线(因为 \w 匹配 _[:alnum:] 不匹配)
  • [:alnum:] - 字母数字字符
  • [:space:] - 任何空白字符
  • ] - 括号表达式结束
  • + - 量词,1 次或多次。