Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

split : différence Python/Perl

13 réponses
Avatar
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 ?

10 réponses

1 2
Avatar
Damien Wyart
* YBM in fr.comp.lang.python:
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
Avatar
Alain Ketterlin
YBM writes:

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.
Avatar
YBM
Merci des infos, je ne suis pas le seul à le considérer comme un bug...
Avatar
Damien Wyart
* Alain Ketterlin in fr.comp.lang.python:
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
Avatar
YBM
Le 13.02.2012 15:24, Alain Ketterlin a écrit :
YBM writes:

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...
Avatar
Damien Wyart
* Alain Ketterlin in fr.comp.lang.python:
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
Avatar
Damien Wyart
> 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 in fr.comp.lang.python:
[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
Avatar
YBM
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 in fr.comp.lang.python:
[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.
Avatar
Damien Wyart
> > > 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 in fr.comp.lang.python:
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
Avatar
YBM
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 in fr.comp.lang.python:
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')
1 2