Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Caractère croisillon, dièse, # dans une chaine, signification particulière ?

+3 votes

Je m'ennuyais, du coup j'ai erré un peu sur les pages de s&m.

J'ai donc testé des trucs avec str.strip()

chaine = '~ ~~ plop ~'
print('~ »» ', chaine.strip('~ ')) # Ok

chaine = '# ## # plop #'
print('# »» ', chaine.strip('# ')) # Huhu, ça a merdu !
for car in chaine.strip('# ') :
    print(ord(car), end=' ') # 160 ? wtf ?

print('\n')

chaine = 'TT TT T plop T'
car = ('#', '~', '«', '²', '±')

for n in car :
    chaineTest = chaine.replace('T', n)
    print(chaineTest, ' »» ', chaineTest.strip(' '+n)) # Huhu, ce coup cu, ca n'a pas merdu, wut ?

Qui retourne :

~ »»  plop
# »»   # plop
160 35 32 112 108 111 112 

## ## # plop #  »»  plop
~~ ~~ ~ plop ~  »»  plop
«« «« « plop «  »»  plop
²² ²² ² plop ²  »»  plop
±± ±± ± plop ±  »»  plop

J'ai pas saisi un truc ou pas ?
Pourquoi un # dans une chaîne provoque l'ajout de ce caractère insécable ?
C'est un bug ?
Et si c'est pas un bug, c'est assez merdique ce comportement.

Note : c'est testé en utf8.

demandé 9-Mai-2016 par Gloups (142 points)

1 Réponse

0 votes

De mon côté, je ne reproduis pas (sous arch) :

Python 3.5.1 (default, Mar  3 2016, 09:29:07) 
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> print('# »» ', chaine.strip('# '))
# »»  plop

Testé aussi en 3.4.2 sous debian et même résultat:

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> print('# »» ', chaine.strip('# ')) # Huhu, ça a merdu !
# »»  plop

Tu as ce comportement avec quel python / sous quel système ?

répondu 9-Mai-2016 par Shadock (286 points)

J'ai testé la dernière partie dans PyCharm, pour rigoler. Interpréteur Python2.7.11
J'obtiens:

('## ## # plop #', ' \xc2\xbb\xc2\xbb ', 'plop')
('~~ ~~ ~ plop ~', ' \xc2\xbb\xc2\xbb ', 'plop')
('\xc2\xab\xc2\xab \xc2\xab\xc2\xab \xc2\xab plop \xc2\xab', ' \xc2\xbb\xc2\xbb ', 'plop')
('\xc2\xb2\xc2\xb2 \xc2\xb2\xc2\xb2 \xc2\xb2 plop \xc2\xb2', ' \xc2\xbb\xc2\xbb ', 'plop')
('\xc2\xb1\xc2\xb1 \xc2\xb1\xc2\xb1 \xc2\xb1 plop \xc2\xb1', ' \xc2\xbb\xc2\xbb ', 'plop')

Je ne reproduis pas non plus sous fedora, python 2.4.3:

Python 3.4.3 (default, Jun 29 2015, 12:16:01) 
[GCC 5.1.1 20150618 (Red Hat 5.1.1-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> chaine.strip('# ')
'plop'

Testé sous Win7:
- 3.5.1
- 3.4.3
- 2.7.5

R:\Trash>python35
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> chaine.strip('# ')
'plop'

R:\Trash>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> chaine.strip('# ')
'plop'

R:\Trash>python27
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> chaine = '# ## # plop #'
>>> chaine.strip('# ')
'plop'
...