2017-07-21 5 views
0

Je suis en train de faire match de iregex dans django pour l'expression régulière djagno regex filtre ne fonctionne pas en re python fonctionne

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

en utilisant le mot « Le Canton » pour le nom mais son non-retour toute valeur, mais en utilisant dans python re.search son travail

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

J'utilise Mysql 5.7, quelqu'un sait comment résoudre ce problème

+1

Voulez-vous dire que le modèle doit être conforme à la syntaxe MySQL REGEXP? Essayez '[_ [: alnum:] [: espace:]] + h [_ [: alnum:] [: espace:]] + anto [_ [: alnum:] [: espace:]] +' puis –

+0

@ Wiktor Stribiżew - Cela a fonctionné –

+0

Veuillez supprimer la balise django-mysql, qui est destinée à la bibliothèque django-mysql –

Répondre

1

Notez que MySQL REGEXP ne prend pas en charge les classes de caractères sténographiques comme \s, \d, `w , etc. It supports some basic POSIX character classes like [: digit:] , [: alpha:] , [: alnum:]`, etc.

Même si vous continuez à utiliser le pattern en Python, vous ne devriez pas écrire (\w|\d|\b|\s)+ car il correspond et capture un seul char qui est un mot char ou chiffre, une limite de mot, ou un espace, 1 fois ou plus (et réécrire le tampon du groupe N avec le dernier caractère le moteur correspondait). Vous pouvez réécrire cela avec une seule classe de caractères - [\w\s]+.

Maintenant, votre modèle MySQL ressemblera

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

[\w\s]+ est transformé en [_[:alnum:][:space:]]+:

  • [ - début d'une expression de support
  • _ - un trait de soulignement (comme \w correspond à _ et [:alnum:] ne correspond pas)
  • [:alnum:] - un alphanuemric carbonisation
  • [:space:] - toute carbonisation whitespace
  • ] - fin de l'expression entre crochets
  • + - quantificateur, 1 ou plusieurs fois.