0

我正在尝试在 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 re.search中使用它时它的工作

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,任何人都知道如何解决这个问题

4

1 回答 1

2

请注意,MySQLREGEXP不支持简写字符类,如\s, \d,\w等。它支持一些基本的 POSIX 字符类,如[:digit:], [:alpha:],[:alnum:]等。

即使您继续在 Python 中使用该模式,您也不应该写入(\w|\d|\b|\s)+,因为它匹配并捕获单个字符,该字符是单词字符或数字、单词边界或空白,1 次或更多次(并使用引擎匹配的最新字符)。您可以使用单个字符类重写它 - [\w\s]+

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

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

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

  • [- 括号表达式的开始
  • _ - 下划线(\w匹配_[:alnum:]不匹配)
  • [:alnum:] - 一个字母数字字符
  • [:space:]- 任何空白字符
  • ]- 括号表达式结束
  • +- 量词,1 次或多次。
于 2017-07-21T11:09:04.827 回答