Bienvenue sur IndexError.

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

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

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'
...