Фильтр Djagno Regex не работает, пока работает Python

Я пытаюсь сделать iregex match в django для регулярного выражения

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,))

используя слово "Кантон" в качестве имени, но оно не возвращает никакого значения, но при использовании его в 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, любой знает, как это исправить

1 ответ

Решение

Обратите внимание, что MySQL REGEXP не поддерживает сокращенные классы символов, такие как \s, \d`W, etc. It supports some basic POSIX character classes like[: Цифры:],[:альфа:],[: alnum:] `и т. д.

Даже если вы продолжаете использовать шаблон в Python, вы не должны писать (\w|\d|\b|\s)+ поскольку он сопоставляет и захватывает один символ, который является словом char или цифрой, границей слова или пробелом, 1 или более раз (и перезаписывает буфер группы N с последним символом, с которым совпал механизм). Вы можете переписать это с одним классом символов - [\w\s]+,

Теперь ваш шаблон в MySQL будет выглядеть

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

где [\w\s]+ превращается в [_[:alnum:][:space:]]+:

  • [ - начало выражения в скобках
  • _ - подчеркивание (как \w Матчи _ а также [:alnum:] не)
  • [:alnum:] - буквенно-цифровой символ
  • [:space:] - любой символ пробела
  • ] - конец выражения скобки
  • + - квантификатор, 1 или более раз.
Другие вопросы по тегам