Comment puis-je minuscule une chaîne en Python?


2058

Existe-t-il un moyen de convertir une chaîne de majuscules, ou même une partie de majuscules en minuscules?

Par exemple, "Kilomètres" → "kilomètres".

Réponses:



259

Comment convertir une chaîne en minuscules en Python?

Existe-t-il un moyen de convertir une chaîne entière entrée par l'utilisateur à partir de majuscules, ou même partiellement en majuscules en minuscules?

Ex. Kilomètres -> kilomètres

La manière canonique Pythonique de le faire est

>>> 'Kilometers'.lower()
'kilometers'

Cependant, si le but est de faire une correspondance insensible à la casse, vous devez utiliser le casse:

>>> 'Kilometers'.casefold()
'kilometers'

Voici pourquoi:

>>> "Maße".casefold()
'masse'
>>> "Maße".lower()
'maße'
>>> "MASSE" == "Maße"
False
>>> "MASSE".lower() == "Maße".lower()
False
>>> "MASSE".casefold() == "Maße".casefold()
True

Il s'agit d'une méthode str en Python 3, mais en Python 2, vous voudrez regarder PyICU ou py2casefold - plusieurs réponses traitent de cela ici .

Unicode Python 3

Python 3 gère les littéraux de chaîne simples comme unicode:

>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'

Python 2, les littéraux de chaîne simples sont des octets

En Python 2, le code ci-dessous, collé dans un shell, code le littéral sous la forme d'une chaîne d'octets, à l'aide de utf-8.

Et lowerne mappe pas les changements dont les octets seraient conscients, nous obtenons donc la même chaîne.

>>> string = 'Километр'
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.lower()
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.lower()
Километр

Dans les scripts, Python s'opposera à ce que les octets non ascii (à partir de Python 2.5 et d'avertissement dans Python 2.4) se trouvent dans une chaîne sans codage donné, car le codage prévu serait ambigu. Pour en savoir plus à ce sujet, consultez la procédure Unicode dans les documents et PEP 263

Utilisez des littéraux Unicode, pas des strlittéraux

Nous avons donc besoin d'une unicodechaîne pour gérer cette conversion, accomplie facilement avec un littéral de chaîne unicode, qui ambiguë avec un upréfixe (et notez que le upréfixe fonctionne également en Python 3):

>>> unicode_literal = u'Километр'
>>> print(unicode_literal.lower())
километр

Notez que les octets sont complètement différents des stroctets - le caractère d'échappement est '\u'suivi par la largeur de 2 octets, ou la représentation 16 bits de ces unicodelettres:

>>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'

Maintenant, si nous ne l'avons que sous la forme d'un str, nous devons le convertir en unicode. Le type Unicode de Python est un format de codage universel qui présente de nombreux avantages par rapport à la plupart des autres codages. Nous pouvons soit utiliser le unicodeconstructeur ou la str.decodeméthode avec le codec pour convertir le stren unicode:

>>> unicode_from_string = unicode(string, 'utf-8') # "encoding" unicode from string
>>> print(unicode_from_string.lower())
километр
>>> string_to_unicode = string.decode('utf-8') 
>>> print(string_to_unicode.lower())
километр
>>> unicode_from_string == string_to_unicode == unicode_literal
True

Les deux méthodes sont converties en type unicode - et identiques à unicode_literal.

Meilleure pratique, utilisez Unicode

Il est recommandé de toujours travailler avec du texte en Unicode .

Le logiciel ne devrait fonctionner qu'avec des chaînes Unicode en interne, convertissant en un encodage particulier en sortie.

Peut encoder en arrière si nécessaire

Cependant, pour récupérer le caractère en minuscules str, encodez à utf-8nouveau la chaîne python :

>>> print string
Километр
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.decode('utf-8')
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower().encode('utf-8')
'\xd0\xba\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.decode('utf-8').lower().encode('utf-8')
километр

Ainsi, en Python 2, Unicode peut coder en chaînes Python et les chaînes Python peuvent décoder en type Unicode.


J'ai une note qui ne s'applique pas nécessairement à la question du PO, mais qui est importante avec la portabilité (internationalisation) lors de la mise en correspondance insensible à la casse. Avec la correspondance insensible à la casse, les signes diacritiques (marques d'accentuation) peuvent devenir un problème. Exemple: >>> "raison d'être".casefold(); "raison d'être"Découvrez cette réponse concernantunidecode
bballdave025

198

Avec Python 2, cela ne fonctionne pas pour les mots non anglais en UTF-8. Dans ce cas, decode('utf-8')peut aider:

>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр

8
Peut-être devrions-nous être un peu plus explicites en disant que decode('utf-8')non seulement n'est pas nécessaire en Python 3, mais provoque une erreur. ( réf ). Exemple: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'Nous pouvons voir une deuxième façon de faire cela, en faisant référence à l'excellente réponse de @AaronHall. >>>s.casefold() #result: километр
bballdave025

20

Vous pouvez également remplacer certaines variables:

s = input('UPPER CASE')
lower = s.lower()

Si vous utilisez comme ceci:

s = "Kilometer"
print(s.lower())     - kilometer
print(s)             - Kilometer

Cela fonctionnera juste au moment de l'appel.


10
La question est de savoir comment transformer une chaîne en minuscules. Comment cette réponse a-t-elle obtenu autant de votes positifs?
Munim Munna

1
s=s.lower()est la voie à suivre.
m00lti

1

N'essayez pas ceci, totalement déconseillé, ne faites pas cela:

import string
s='ABCD'
print(''.join([string.ascii_lowercase[string.ascii_uppercase.index(i)] for i in s]))

Production:

abcd

Puisque personne ne l'a encore écrit, vous pouvez l'utiliser swapcase(donc les lettres majuscules deviendront minuscules, et vice versa) (et celle-ci, vous devriez l'utiliser dans les cas où je viens de le mentionner (convertir le haut en bas, le bas en haut)):

s='ABCD'
print(s.swapcase())

Production:

abcd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.