Python >> Tutoriel Python >  >> Python Tag >> RegEx

Erreur de répétition multiple de Python Regex

Tout comme moi il y a une heure, vous êtes probablement assis devant votre code d'expression régulière, intrigué par un étrange message d'erreur :

re.error: multiple repeat at position x

Pourquoi est-il relevé ? D'où est ce que ça vient? Et surtout, comment s'en débarrasser ?

Cet article vous donne des réponses à toutes ces questions. Alternativement, vous pouvez également regarder ma courte vidéo explicative qui vous montre très rapidement comment résoudre cette erreur :

Article connexe : Python Regex Superpower - Le guide ultime

Comment se produit l'erreur de répétition multiple dans Python Re ?

Bibliothèque de regex de Python re génère l'erreur de répétition multiple lorsque vous empilez deux quantificateurs de regex l'un sur l'autre. Par exemple, le modèle regex 'a++' provoquera l'erreur de répétition multiple. Vous pouvez vous débarrasser de cette erreur en évitant d'empiler les quantificateurs les uns sur les autres.

Voici un exemple :

>>> import re
>>> re.findall('a++', 'aaaa')
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    re.findall('a++', 'aaaa')
  File "C:\Users\xcent\AppData\Local\Programs\Python\Python37\lib\re.py", line 223, in findall
   ...
re.error: multiple repeat at position 2

J'ai raccourci le message d'erreur pour me concentrer sur les parties pertinentes. Dans le code, vous importez d'abord la bibliothèque regex re . Vous utilisez alors le re.findall(pattern, string) fonction (voir ce tutoriel de blog) pour trouver le motif 'a++' dans la chaîne 'aaaa' .

Cependant, cela n'a pas beaucoup de sens :quelle est la signification du modèle a++ De toute façon? Avoir un seul quantificateur a+ se lit déjà comme "trouver toutes les correspondances où au moins un caractère 'a' matchs" .


Voulez-vous maîtriser la superpuissance des regex ? Découvrez mon nouveau livre La façon la plus intelligente d'apprendre les expressions régulières en Python avec l'approche innovante en 3 étapes pour un apprentissage actif :(1) étudiez un chapitre de livre, (2) résolvez un puzzle de code et (3) regardez une vidéo de chapitre éducatif.

[Astuces] Quelle est la source de l'erreur de répétition multiple et comment l'éviter ?

L'erreur se produit si vous utilisez le package Python regex re . Il existe de nombreuses raisons différentes, mais toutes ont la même source :vous empilez des quantificateurs les uns sur les autres.

Si vous ne savez pas ce qu'est un quantificateur, faites défiler vers le bas et lisez la sous-section suivante où je vous montre exactement ce que c'est.

Voici une liste des raisons du message d'erreur. Peut-être que votre raison en fait partie ?

  • Vous utilisez le modèle regex 'X++' pour toute expression régulière X . Pour éviter cette erreur, supprimez un quantificateur.
  • Vous utilisez le modèle regex 'X+*' pour toute expression régulière X . Pour éviter cette erreur, supprimez un quantificateur.
  • Vous utilisez le modèle regex 'X**' pour toute expression régulière X . Pour éviter cette erreur, supprimez un quantificateur.
  • Vous utilisez le modèle regex 'X{m,n}*' pour toute expression régulière X et nombre de répétitions m et n . Pour éviter cette erreur, supprimez un quantificateur.
  • Vous essayez de faire correspondre un nombre de caractères '+' et utilisez un deuxième quantificateur par-dessus, tel que '+?' . Dans ce cas, vous devez échapper le premier symbole quantificateur '\+' .
  • Vous essayez de faire correspondre un nombre de caractères '*' et utilisez un deuxième quantificateur par-dessus, tel que '*+' . Évitez cette erreur en échappant le premier symbole de quantificateur '\*' .

Souvent, l'erreur apparaît si vous n'échappez pas correctement les méta-caractères de quantificateur spéciaux dans votre modèle regex.

Voici un post StackOverflow qui montre du code où cela s'est produit :

...
term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
p = re.compile(term, re.IGNORECASE)  
...

J'ai édité l'extrait de code donné pour montrer la partie importante. Le code échoue à cause d'un multiple repeat error . Pouvez-vous voir pourquoi ?

La raison est que la regex 'lg incite" OR author:"http++www.dealitem.com" OR "for sale' contient deux quantificateurs plus empilés l'un sur l'autre dans la sous-chaîne 'http++' . Débarrassez-vous de ceux-ci et le code s'exécutera à nouveau !

Quantificateurs Python Regex

Le mot "quantificateur" vient du latin :sa signification est quantus =combien / combien de fois .

C'est précisément ce que signifie un quantificateur d'expression régulière :vous indiquez au moteur de regex à quelle fréquence vous souhaitez faire correspondre un modèle donné.

Si vous pensez ne définir aucun quantificateur, vous le faites implicitement :aucun quantificateur signifie qu'il faut correspondre exactement une fois à l'expression régulière.

Alors, quels sont les quantificateurs regex en Python ?

Quantificateur Signification
A? Reconnaître l'expression régulière A zéro ou une fois
A* Reconnaître l'expression régulière A zéro ou plusieurs fois
A+ Reconnaître l'expression régulière A une ou plusieurs fois
A{m} Reconnaître l'expression régulière A exactement m fois
A{m,n} Reconnaître l'expression régulière A entre m et n fois (inclus)

Notez que dans ce didacticiel, je suppose que vous avez au moins une vague idée de ce que sont réellement les expressions régulières. Si ce n'est pas le cas, pas de problème, consultez mon tutoriel détaillé sur les regex sur ce blog.

Vous voyez dans le tableau que les quantificateurs ? , * , + , {m} , et {m,n} définir la fréquence à laquelle vous répétez la correspondance de regex A .

Examinons quelques exemples, un pour chaque quantificateur :

>>> import re
>>> re.findall('a?', 'aaaa')
['a', 'a', 'a', 'a', '']
>>> re.findall('a*', 'aaaa')
['aaaa', '']
>>> re.findall('a+', 'aaaa')
['aaaa']
>>> re.findall('a{3}', 'aaaa')
['aaa']
>>> re.findall('a{1,2}', 'aaaa')
['aa', 'aa']

Dans chaque ligne, vous essayez un quantificateur différent sur le même texte 'aaaa' . Et, fait intéressant, chaque ligne mène à une sortie différente :

  • La regex zéro ou un 'a?' correspond à quatre fois un 'a' . Notez qu'il ne correspond pas à zéro caractère s'il peut éviter de le faire.
  • La regex zéro ou plus 'a*' correspond une fois à quatre 'a' s et les consomme. À la fin de la chaîne, il peut toujours correspondre à la chaîne vide.
  • Une ou plusieurs expressions régulières 'a+' correspond une fois à quatre 'a' s. Contrairement au quantificateur précédent, il ne peut pas correspondre à une chaîne vide.
  • La regex répétitive 'a{3}' correspond jusqu'à trois 'a' s en une seule passe. Il ne peut le faire qu'une seule fois.
  • La regex répétitive 'a{1,2}' correspond à un ou deux 'a' s. Il essaie d'en faire correspondre autant que possible.

Vous avez appris les quantificateurs de base des expressions régulières Python.

Message d'erreur alternatif (fragments)

Vous pouvez rencontrer l'un des fragments suivants qui conduisent tous à l'erreur de répétition multiple :

  • re.error: multiple repeat at position
  • multiple repeat at position
  • sre_constants.error: multiple repeat
  • répétition multiple de l'expression régulière python
  • python concernant les répétitions multiples
  • répétition multiple de regex
  • re.error multiple repeat at position

Encore une fois, vous pouvez corriger l'erreur de répétition multiple en évitant d'empiler deux quantificateurs regex l'un sur l'autre. Par exemple, le modèle regex 'a++' provoquera l'erreur de répétition multiple - utilisez un seul quantificateur tel que 'a+' Au lieu.