split : différence Python/Perl

Le
YBM
Je n'arrive pas à m'expliquer la différence de comportement
de split entre Perl et Python :

>>> print re.split(r'','abcd')
['abcd']

Tandis que :

$ perl -e '$,=","; print split(m{},"abcd"); print ""'
a,b,c,d

C'est le comportement de Perl qui me semble correct (entre deux
caractères d'une chaîne, ce qui les sépare c'est "rien").

Bug du module re ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #24243581
* YBM
Je n'arrive pas à m'expliquer la différence de comportement
de split entre Perl et Python :

>>> print re.split(r'','abcd')
['abcd']

Tandis que :

$ perl -e '$,=","; print split(m{},"abcd"); print "n"'
a,b,c,d

C'est le comportement de Perl qui me semble correct (entre deux
caractères d'une chaîne, ce qui les sépare c'est "rien").

Bug du module re ?



C'est plus compliqué que ça. En résumé, il y a des discussions assez
régulières là-dessus depuis 2004, qui stagnent pendant assez longtemps.
Vers 2008, Van Rossum a tranché pour ne pas modifier le comportement
actuel, puis as donné son accord pour éventuellement avoir le "bon"
comportement avec un flag dédié. Mais il ne s'est rien passé... En tous
cas, la doc actuelle pour 2.7 et 3.2 indique : "Note that split will
never split a string on an empty pattern match."

Par la suite, ce sujet a été regroupé dans celui, plus vaste, de
refondre le moteur d'expressions régulières de Python. Un nouveau moteur
va être proposé dans Python 3.3 (à côté du moteur actuel), et ce nouveau
moteur permet bien d'appeler split avec des patterns vides. Ouf !

Voici des liens pour plus de détails :

http://mail.python.org/pipermail/python-dev/2004-August/047272.html
http://mail.python.org/pipermail/patches/2006-January/018705.html

http://bugs.python.org/issue988761
http://bugs.python.org/issue852532
http://bugs.python.org/issue3262
http://bugs.python.org/issue2636
http://pypi.python.org/pypi/regex

--
DW
Alain Ketterlin
Le #24243571
YBM
Je n'arrive pas à m'expliquer la différence de comportement
de split entre Perl et Python :

print re.split(r'','abcd')






['abcd']

Tandis que :

$ perl -e '$,=","; print split(m{},"abcd"); print "n"'
a,b,c,d

C'est le comportement de Perl qui me semble correct (entre deux
caractères d'une chaîne, ce qui les sépare c'est "rien").



C'est une décision explicite : la doc dit "Note that split will never
split a string on an empty pattern match." Cela recouvre ton exemple,
mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
suis assez d'accord avec ce choix : par exemple, que devrait faire
re.split('x*','aaaxxxbbb') ? Si le but est de découper en caractè res, il
y a mieux que les expressions régulières.

-- Alain.
YBM
Le #24243701
Merci des infos, je ne suis pas le seul à le considérer comme un bug...
Damien Wyart
Le #24243691
* Alain Ketterlin
Si le but est de découper en caractères,
il y a mieux que les expressions régulières.



Les maximes rimées de fclp ? ;-)

--
DW
YBM
Le #24243681
Le 13.02.2012 15:24, Alain Ketterlin a écrit :
YBM
Je n'arrive pas à m'expliquer la différence de comportement
de split entre Perl et Python :

print re.split(r'','abcd')






['abcd']

Tandis que :

$ perl -e '$,=","; print split(m{},"abcd"); print "n"'
a,b,c,d

C'est le comportement de Perl qui me semble correct (entre deux
caractères d'une chaîne, ce qui les sépare c'est "rien").



C'est une décision explicite : la doc dit "Note that split will never
split a string on an empty pattern match." Cela recouvre ton exemple,
mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
suis assez d'accord avec ce choix : par exemple, que devrait faire
re.split('x*','aaaxxxbbb') ?



[a,b,c,d,e,f]

et avec x+
[aaa,bbb]

Si le but est de découper en caractères, il
y a mieux que les expressions régulières.



Pas toujours...
Damien Wyart
Le #24243801
* Alain Ketterlin
C'est une décision explicite : la doc dit "Note that split will never
split a string on an empty pattern match." Cela recouvre ton exemple,
mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
suis assez d'accord avec ce choix : par exemple, que devrait faire
re.split('x*','aaaxxxbbb') ?



Pour information, avec le module regex donc je parle dans ma réponse
principale, on obtient ceci :

regex.split('x*','aaaxxxbbb')






['aaa', 'bbb']

--
DW
Damien Wyart
Le #24243791
> C'est une décision explicite : la doc dit "Note that split will never
> split a string on an empty pattern match." Cela recouvre ton exemple,
> mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
> suis assez d'accord avec ce choix : par exemple, que devrait faire
> re.split('x*','aaaxxxbbb') ?



* YBM
[a,b,c,d,e,f]



Faute de frappe ? Je suppose que tu as voulu écrire :
['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b']
?

Comme indiqué dans un autre message, ce n'est pas ce qui a été retenu
dans le nouveau module d'expressions régulières qui sera intégré
à Python 3.3 (mais peut aussi être compilé manuellement pour 2.7 et
3.2).
--
DW
YBM
Le #24243851
Le 13.02.2012 15:54, Damien Wyart a écrit :
C'est une décision explicite : la doc dit "Note that split will never
split a string on an empty pattern match." Cela recouvre ton exemple,
mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
suis assez d'accord avec ce choix : par exemple, que devrait faire
re.split('x*','aaaxxxbbb') ?





* YBM
[a,b,c,d,e,f]



Faute de frappe ? Je suppose que tu as voulu écrire :
['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b']
?



Non, je persiste :

$ perl -e '$,=","; print split(m{x*},"abxxxcdefxxx"); print "n"'
a,b,c,d,e,f

Comme indiqué dans un autre message, ce n'est pas ce qui a été retenu
dans le nouveau module d'expressions régulières qui sera intégré
à Python 3.3 (mais peut aussi être compilé manuellement pour 2.7 et
3.2).



c'est bien dommage, ce n'est pas logique... * est gourmand.
Damien Wyart
Le #24243911
> > > C'est une décision explicite : la doc dit "Note that split will never
> > > split a string on an empty pattern match." Cela recouvre ton exemple,
> > > mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
> > > suis assez d'accord avec ce choix : par exemple, que devrait faire
> > > re.split('x*','aaaxxxbbb') ?

> > [a,b,c,d,e,f]

> Faute de frappe ? Je suppose que tu as voulu écrire :
> ['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b']
> ?



* YBM
Non, je persiste :

$ perl -e '$,=","; print split(m{x*},"abxxxcdefxxx"); print "n"'
a,b,c,d,e,f



Du coup tu ne répondais pas à Alain alors que tu plaçait ta réponse
juste après sa question. C'est un peu déroutant...
--
DW
YBM
Le #24243901
Le 13.02.2012 16:29, Damien Wyart a écrit :
C'est une décision explicite : la doc dit "Note that split will never
split a string on an empty pattern match." Cela recouvre ton exemple,
mais aussi celui de la doc (re.split('x*', 'foo') renvoie 'foo'). Je
suis assez d'accord avec ce choix : par exemple, que devrait faire
re.split('x*','aaaxxxbbb') ?









[a,b,c,d,e,f]







Faute de frappe ? Je suppose que tu as voulu écrire :
['a', 'a', 'a', 'x', 'x', 'x', 'b', 'b', 'b']
?





* YBM
Non, je persiste :



$ perl -e '$,=","; print split(m{x*},"abxxxcdefxxx"); print "n"'
a,b,c,d,e,f



Du coup tu ne répondais pas à Alain alors que tu plaçait ta réponse
juste après sa question. C'est un peu déroutant...



Euh... je me suis emmêlé les pinceaux avec mes différents tests et
différent terminaux...

Ceci dit je voulais dire que, selon moi, ceci est logique :

['a','a','a','b','b','b'] pour re.split('x*','aaaxxxbbb')
Publicité
Poster une réponse
Anonyme