regex erreur - rien à redire
Je reçois un message d'erreur lorsque j'utilise cette expression:
re.sub(r"([^\s\w])(\s*)+","\","...")
J'ai vérifié les regex à RegExr et il retourne .
comme prévu. Mais quand je l'ai essayer en Python, j'obtiens ce message d'erreur:
raise error, v # invalid expression
sre_constants.error: nothing to repeat
Quelqu'un peut expliquer?
- Si quelqu'un obtient cette erreur, sans raison apparente, assurez-vous que la version de Python utilisée lors de la création de votre virtualenv est toujours conforme à la version de l'interpréteur installé à l'échelle mondiale (p. ex., ancien vritualenv créés avant la mise à jour de Python vers une version plus récente.)
- Comment pourrais-je le réajuster, de sorte qu'ils sont les mêmes?
- J'ai juste détruit l'existant env, et recréée.
- C'est corrigé dans la version actuelle de python et de ne pas jeter l'exception plus. Voir Python Issue18647.
- J'ai eu un idiot cause de l'erreur où j'ai été correspondant pour un char de la séquence qui a commencé avec un astérisque. S'échapper de la astérisque aidé. Vérifier que ce n'est pas la question avant de conclure que le Python bug a provoqué l'erreur.
Vous devez vous connecter pour publier un commentaire.
Il semble être un python bug (qui fonctionne parfaitement dans vim).
La source du problème est l' (\s*...)+ bit. Fondamentalement , vous ne pouvez pas faire
(\s*)+
qui font sens , parce que vous essayez de répéter quelque chose qui peut être null.Cependant
(\s*\1)
ne doit pas être nul, mais nous savons que cela uniquement parce que nous savons ce qui est dans \1. Apparemment, python n'est pas ... c'est bizarre.C'est un Python bug entre "*" et des caractères spéciaux.
Au lieu de
Essayer:
Cela fonctionne, cependant, ne pas faire la même expression régulière.
Ce bug semble avoir été fixé entre 2.7.5 et 2.7.6.
Ce n'est pas seulement un Python bug avec * en fait, il peut également se produire lorsque vous passez une chaîne de caractères comme une partie de votre expression régulière pour être compilé, comme ;
cela va provoquer une erreur si le traitement de la ligne de contenus de certains "(+)" par exemple, comme vous pouvez en trouver dans les formules chimiques, ou de telles chaînes de caractères.
la solution est de fuir, mais quand vous le faites à la volée, il peut arriver que vous ne parviennent pas à le faire correctement...
Au-delà du bug qui a été découvert et corrigé, je vais prendre note que le message d'erreur
sre_constants.error: nothing to repeat
est un peu déroutant. J'ai essayé d'utiliserr'?.*'
comme un modèle, et pensait que c'était de se plaindre pour quelque étrange raison, à propos de la*
, mais le problème est en fait que?
est une manière de dire "répéter zéro ou une fois". J'ai donc besoin de direr'\?.*'
pour correspondre à un littéral?
expression régulière utilise normalement * et + dans la théorie de la langue.
Je rencontre le même bug lors de l'exécution de la ligne de code
pour le résoudre, il doit inclure des \ avant * et +