9
votes

Python Regex Comportement étrange

J'ai découvert quelque chose que je ne peux pas expliquer dans le module Python Re. Compilation de (a *) * ou (a * | b) * jette une erreur:

Erreur d'erreur, v # Expression invalide sre_concstants.error: rien à répéter

J'ai testé cette regexp en JavaScript et cela semble être ok.

est-ce un bug?


5 Réponses :


5
votes

Un bug en python.

http://bugs.python.org/issue2537

http://bugs.python.org/issue214033

Peut-être qu'un "bogue" n'est pas le mot correct ici. Différent type d'interprétation ...


1 commentaires

Wow! J'ai trouvé le premier bug dans Python dans ma vie =)



9
votes

Oui, c'est un bogue (ou au moins une erreur de traficture). Il se plaint que si a * correspond à rien, il ne sait pas comment capturer 0 ou plus "NOTHINGS".


0 commentaires

5
votes

a * peut être null, donner (null) * ce qui n'a aucun sens pour l'interprète. (a * | b) peut également être null car il peut être évalué à (b) ou (A *) . Code> (A +) * et donc (A + | b) *


5 commentaires

Je suis absolument d'accord avec vous, mais de toute façon que mon esprit a raison.


@ f0b0s essentiellement @Mu et je dis la même chose - la seule différence étant explicitement - c'est pourquoi je l'ai susceptible de monter en premier.


Je ne comprends toujours pas. Si vous ne pouvez pas répéter NULL est une fonctionnalité. Alors pourquoi (a?) * Est valide alors? Il peut aussi donner (null) *.


@Wang je n'ai aucune idée pourquoi (a?) * Serait valide, il semble que logiquement, cela ne devrait pas être


C'est un retour d'un bug fixe. Cela a été à nouveau fixé récemment. soupir! Python....



0
votes

1
votes

Il y a en fait une raison importante de Python de rejeter (a *) * et (A * | b) * . Étant donné que * est gourmand, il correspond à la chaîne la plus longue possible. Le problème est que si la regex modifiée par * est vide, l'analyseur d'expression régulier tente de correspondre autant de répétitions de la chaîne vide possible. Cela signifie qu'il correspond à n'importe quel nombre de chaînes vides entre deux caractères de la chaîne que vous testez. Étant donné que a * est dans un groupe de capture, il devrait capter toutes ces chaînes vides, ce qui serait impossible.


0 commentaires