Фильтр 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 или более раз.