web-dev-qa-db-fra.com

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

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

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

1854
Benjamin Didur

Utilisez .lower() - Par exemple:

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

La documentation officielle 2.x est ici: str.lower()
La documentation officielle 3.x est ici: str.lower()

2848
Petar Ivanov

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

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

Comment convertir une chaîne en minuscule en Python?

Existe-t-il un moyen de convertir une chaîne saisie par un utilisateur entier en majuscule, ou même une partie en majuscule en minuscule?

Par exemple. Kilomètres -> kilomètres

La manière canonique de le faire est de

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

Toutefois, si le but est de faire de la correspondance insensible à la casse, vous devez utiliser la 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
_

C'est une méthode str dans Python 3, mais dans Python 2, vous voudrez vous pencher sur PyICU ou py2casefold - plusieurs réponses traitent cette question ici .

Unicode Python 3

Python traite 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

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

Et lower ne mappe aucune modification dont les octets auraient connaissance, 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 aux octets non-ascii (à partir de Python 2.5, et en avertissant dans Python 2.4) les octets étant dans une chaîne sans codage, puisque le codage prévu serait ambigu. Pour plus d'informations à ce sujet, consultez la procédure Unicode dans docs et PEP 26

Utilisez des littéraux Unicode et non str littéraux

Nous avons donc besoin d’une chaîne unicode pour gérer cette conversion, facilement réalisée avec un littéral de chaîne unicode, qui se démarque avec un préfixe u (et notez que le préfixe u fonctionne également dans Python 3):

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

Notez que les octets sont complètement différents des str octets. Le caractère d'échappement est _'\u'_ suivi de la largeur sur 2 octets ou de la représentation 16 bits de ces unicode lettres:

_>>> 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 l’avons seulement sous la forme d’un str, nous devons le convertir en unicode. Le type Unicode de Python est un format de codage universel comportant de nombreux avantages par rapport à la plupart des autres codages. Nous pouvons utiliser le constructeur unicode ou la méthode _str.decode_ avec le codec pour convertir le str en 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 identique à 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, en convertissant un codage particulier en sortie.

Peut ré-encoder si nécessaire

Toutefois, pour obtenir les minuscules dans le type str, codez à nouveau la chaîne python en _utf-8_:

_>>> 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, dans Python 2, Unicode peut coder en Python chaînes, et les chaînes Python peuvent être décodées en type Unicode.

192
Aaron Hall

Vous pouvez faire ce que Peter dit , ou si vous voulez que l'utilisateur entre quelque chose, vous pouvez faire le code ci-dessous:

raw_input('Type Something').lower()

Il convertira ensuite automatiquement la chaîne saisie en minuscule.

Remarque: raw_input a été renommé en input dans Python 3.x et versions ultérieures.

66
user735977

En outre, vous pouvez écraser 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.

18
ergo

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

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

Sortie:

abcd

Comme personne ne l’a encore écrit, vous pouvez utiliser swapcase (les lettres majuscules deviendront alors en minuscules, et vice versa) (et vous devriez l’utiliser dans les cas où je viens de mentionner (convertir majuscule en minuscule, minuscule en minuscule)) :

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

Sortie:

abcd
2
U10-Forward