J'ai découvert quelque chose que je ne peux pas expliquer dans le module Python Re.
Compilation de Erreur d'erreur, v # Expression invalide
sre_concstants.error: rien à répéter p>
blockQuote>
J'ai testé cette regexp en JavaScript et cela semble être ok. p>
est-ce un bug? p> (a *) * code> ou
(a * | b) * code> jette une erreur: p>
5 Réponses :
Un bug en python. P>
http://bugs.python.org/issue2537 P>
http://bugs.python.org/issue214033 p>
Peut-être qu'un "bogue" n'est pas le mot correct ici. Différent type d'interprétation ... P>
Wow! J'ai trouvé le premier bug dans Python dans ma vie =)
Oui, c'est un bogue (ou au moins une erreur de traficture). Il se plaint que si a * code> correspond à rien, il ne sait pas comment capturer 0 ou plus "NOTHINGS". P>
a * code> peut être null, donner
(null) * code> ce qui n'a aucun sens pour l'interprète.
(a * | b) code> peut également être null car il peut être évalué à
(b) code> ou
(A *) code>. Code> (A +) * code> et donc
(A + | b) * code> p>
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....
Il y a en fait une raison importante de Python de rejeter (a *) * code> et
(A * | b) * code>. Étant donné que
* code> est gourmand, il correspond à la chaîne la plus longue possible. Le problème est que si la regex modifiée par
* code> 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 * code> est dans un groupe de capture, il devrait capter toutes ces chaînes vides, ce qui serait impossible. P>
Related: (a *) * code> est identique que
a * code> et
(a * | b) * code> est identique au
[AB ] * code> (ou
(a | b) * code>). Y a-t-il un bon cas d'utilisation, hors de curiosité?
@Kobi Peut-être que si c'est une correspondance gourmande, où vous correspondez aussi longtemps qu'une chaîne possible mais moins d'instances - mais pour cela, vous souhaiteriez
+ code> pas
* code>