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 ?

3 réponses

1 2
Avatar
Alain Ketterlin
Damien Wyart writes:

* Alain Ketterlin in fr.comp.lang.python:
C'est une décision explicite : la doc dit "Note that split will nev er
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']



Euh, avec re aussi (en 2.6 au moins). Je serais plus surpris d'obtenir
['a','a','a','b','b','b'] (mais c'est sûrement parce que je fuis perl
comme la peste).

Si le choix change avec 3+ (si j'ai bien compris), il faudra s'y faire.
Après tout, c'est une question de convention, puisque
['a','aa','bb','b'] serait tout aussi correct, bien qu'improbable (et
inconsistant).

-- Alain.
Avatar
Damien Wyart
> Pour information, avec le module regex donc je parle dans ma réponse
> principale, on obtient ceci :

>>>> regex.split('x*','aaaxxxbbb')
> ['aaa', 'bbb']



* Alain Ketterlin in fr.comp.lang.python:
Euh, avec re aussi (en 2.6 au moins). Je serais plus surpris d'obtenir
['a','a','a','b','b','b'] (mais c'est sûrement parce que je fuis perl
comme la peste).



Désolé, j'ai testé trop vite, j'ai oublié de désactiver le mode
"compatibilité avec re" (et on retrouvait bien ce que donne le module re
en 2.6). Du coup, en mode non-compatible, on obtient ceci, et c'est donc
bien cette nouveauté que je voulais citer au départ :

regex.split('x*','aaaxxxbbb',flags=regex.V1)






['', 'a', 'a', 'a', 'b', 'b', 'b', '']

Si le choix change avec 3+ (si j'ai bien compris), il faudra s'y faire.
Après tout, c'est une question de convention, puisque
['a','aa','bb','b'] serait tout aussi correct, bien qu'improbable (et
inconsistant).



A priori le choix semble assez cohérent avec ce que souhaitait
intuitivement YBM : le pattern est vide là où ça ne matche pas et
gourmand là où ça matche.

--
DW
Avatar
YBM
Le 13.02.2012 17:02, Damien Wyart a écrit :
...
regex.split('x*','aaaxxxbbb',flags=regex.V1)






['', 'a', 'a', 'a', 'b', 'b', 'b', '']

Si le choix change avec 3+ (si j'ai bien compris), il faudra s'y faire.
Après tout, c'est une question de convention, puisque
['a','aa','bb','b'] serait tout aussi correct, bien qu'improbable (et
inconsistant).



A priori le choix semble assez cohérent avec ce que souhaitait
intuitivement YBM : le pattern est vide là où ça ne matche pas et
gourmand là où ça matche.



Sauf que les '' en premier et en dernier, ça fait un peu désordre là...
1 2