strip() et la bande(chaîne de caractères.des espaces) donnent des résultats différents en dépit de la documentation qui suggère qu'ils devraient être les mêmes
J'ai une chaîne Unicode avec certains non-rupture des espaces au début et à la fin. J'obtiens des résultats différents lors de l'utilisation de strip()
vs strip(string.whitespace)
.
>>> import string
>>> s5 = u'\xa0\xa0hello\xa0\xa0'
>>> print s5.strip()
hello
>>> print s5.strip(string.whitespace)
hello
La documentation pour strip()
dit, "Si omis ou None
, le chars
argument par défaut en supprimant les espaces." La documentation pour string.whitespace
dit, "Une chaîne contenant tous les caractères qui sont considérés comme des espaces."
Donc si string.whitespace
contient tous les caractères qui sont considérés comme des espaces, alors pourquoi les résultats sont-ils différents? A-t-elle quelque chose à voir avec l'Unicode?
Je suis à l'aide de Python 2.7.6
string.whitespace
est " \t\n\r\x0b\x0c"
sur mon Python 3.2.3. Clairement Unicode est hors de l'image.La documentation n'est pas dire que
string.whitespace
est utilisé par unicode.strip
à définir ce qui est et n'est pas d'espaces, cependant. Je crois que la plupart des string
module est obsolète, après avoir été plié dans le str
classe elle-même.en dehors de constantes, de Modèle, de Formatage et de maketrans - yup... à peu près tous sur la classe maintenant
OriginalL'auteur Becca codes | 2014-03-06
Vous devez vous connecter pour publier un commentaire.
À partir de la documentation de la
string.les espaces
:C'est la même chose sous python3, où tous les non-ASCII constantes où retiré. (En python2 certaines constantes qui pourraient être influencés par
locale
paramètres).D'où la différence de comportement est tout à fait évident depuis
strip()
ne supprimer tout unicode espaces, tout enstrip(string.whitespace)
supprime seulement les espaces ASCII. Votre chaîne clairement contient des caractères non ASCII espaces.Comme je l'ai dit dans python2 certains de ces "constantes" qui dépend en fait de la configuration locale. En python3 ce n'est pas vrai. Notez que
locale
!= unicode. En python3, ils ont décidé de se débarrasser de cettelocale
comportement dépendant pour ne garder que l'ASCII variantes. Je ne sais pas pourquoi ils n'ont pas changé le nom deascii_whitespace
. Notez également questring.whitespace
en python2 est un byte de la chaîne, ce qui devrait déjà vous dire que c' pas contient tous les espaces unicode des caractères.Je n'ai pas travaillé avec unicode beaucoup, donc je vais avoir un peu de mal à comprendre. son comme vous dites que dans Python 2.7, chaîne.les espaces contiennent certains caractères non-ASCII, basé sur les paramètres régionaux. Mais il semble que le caractère u'\xa0' serait encore de ne pas être un candidat possible. Pourquoi?
est une chaîne d'octets, ce qui signifie qu'il ne peut pas contenir une unicode "caractère" ou "codepoint". Au plus, elle peut contenir un caractère unicode codé dans certains encodage. Par exemple
u'\xa0'.encode('utf-8')
être trouvé dansstring.whitespace
à l'aide de certains paramètres régionaux. Cependant, sur ma machine, même en changeant les paramètres régionaux ne change passtring.whitespace
.OriginalL'auteur Bakuriu