【问题标题】:djagno filter regex not working while python re workspython re工作时django过滤器正则表达式不起作用
【发布时间】:2017-12-27 09:11:06
【问题描述】:

我正在尝试在 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,有谁知道怎么解决这个问题

【问题讨论】:

  • 你的意思是模式必须符合 MySQL REGEXP 语法吗?试试[_[:alnum:][:space:]]+h[_[:alnum:][:space:]]+anto[_[:alnum:][:space:]]+ 然后
  • @Wiktor Stribiżew - 成功了
  • 请去掉 django-mysql 标签,它是用于库 django-mysql

标签: mysql regex django django-models django-mysql


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2017-02-19
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多