4.3. Les chaînes de caractères¶
Nous avons déjà introduit les chaînes de caractères. Nous allons à présent passer en revue certaines des fonctions avancées pour les manipuler.
Les chaînes de caractères sont un type de données complexe qui a de nombreux points communs avec les listes. Tout comme celles-ci, il s’agit d’une suite ordonnée de valeurs (en l’occurrence des caractères).
4.3.1. Accéder aux caractères d’une chaîne¶
De la même façon que pour les listes, il est possible d’accéder à un ou plusieurs caractères d’une chaîne grâce à leur indice.
my_str = "chaîne_de_caractères"
print(my_str[0]) # 1er caractère uniquement
print(my_str[10:]) # tous les caractères à partir du 11e
c
caractères
La figure 4.2 ci-dessous illustre différentes manières d’accéder aux caractères d’une chaîne via leur indice.
La chaîne s
comprend 14 caractères d’indices 0 à 13.
On peut accéder à des caractères individuels ou à des plages de caractères (sous-chaînes), comme par exemple s[-3:]
pour désigner le préfixe composé des trois derniers caractères (équivalent ici à s[11:]
ou s[11:14]
).
4.3.2. Modifier ou supprimer un caractère¶
Les chaînes de caractères sont immuables. Cela signifie qu’il est impossible de changer ou supprimer un caractère via son indice comme on le ferait avec une liste. Si l’on désire modifier une chaîne, il faut donc en créer une nouvelle.
s = "Plage"
print(s)
s = s[:1] + s[2:] # on crée une nouvelle chaîne en supprimant le 2e caractère
print(s)
s = "S" + s[1:] # on crée une nouvelle chaîne en modifiant le 1er caractère
print(s)
Plage
Page
Sage
4.3.3. Parcourir une chaîne¶
Comme pour les listes, il est possible d’itérer sur une chaîne de caractères. Dans l’exemple suivant, on aimerait inverser les lettres d’un mot.
word = "Bonjour"
reverse = ""
for letter in word: # pour chacune des lettres du mot...
reverse = letter + reverse # on ajoute la lettre en début de la chaîne inverse
print(reverse)
ruojnoB
On commence par créer une variable, word
, qui contient la chaîne de caractères originale ("Bonjour"
).
On crée ensuite une seconde variable, reverse
, pour le mot inverse.
Puis on utilise une boucle for
pour parcourir le mot et on ajoute tour à tour chacune des lettres au début de la chaîne inverse.
On affiche finalement le mot inverse dans la console.
4.3.4. Recherche dans une chaîne¶
Le mot clé in
, que nous avons déjà vu dans le contexte des listes, permet de déterminer si une chaîne de caractères est contenue dans une autre.
On pourra ainsi, par exemple, déterminer si une lettre est présente dans un mot.
print('a' in 'avion') # la lettre 'a' se trouve-t-elle dans le mot 'avion' ?
True
À l’inverse, l’expression not in
permet de savoir si une chaîne ne se trouve pas dans une autre.
print('u' not in 'avion')
True
4.3.5. Formatage de chaînes¶
Le formatage sert à mettre en forme les chaînes de caractères afin, par exemple, d’insérer des valeurs à l’intérieur d’une chaîne ou d’ajouter des espaces pour la justifier à droite.
Séquence d’échappement¶
Le formatage repose sur une syntaxe particulière des chaînes de caractères contenant des séquences d’échappement.
Une séquence d’échappement commence par le symbole \
(barre oblique inversée).
Les caractères qui suivent prennent alors un rôle particulier et sont interprétés selon des règles différentes.
Cela permet notamment d’ajouter des guillemets à l’intérieur d’une chaîne de caractères ou d’insérer un retour à la ligne au milieu de la chaîne.
Essayons d’afficher un chaîne de caractères avec des guillemets à l’intérieur. Si l’on écrit notre code naïvement, l’interprète produit une erreur.
print("Il s'exclama : "Regarde, un oiseau !"")
SyntaxError: invalid syntax
En effet, les guillemets sont interprétés comme des symboles de début ou fin de chaînes et ne peuvent donc être contenus à l’intérieur.
Il est parfois possible de contourner le problème en utilisant des guillemets simples ('
) à l’extérieur et doubles ("
) à l’intérieur.
print('Elle dit : "Il fait beau."')
Cependant, cette solution n’est pas applicable à notre premier exemple qui contient des guillemets simples et doubles. Nous pouvons cependant échapper les guillemets doubles grâce à la barre oblique inversée. Ils perdent alors leur fonction de délimiteurs de chaîne et sont interprétés littéralement.
print("Il s'exclama : \"Regarde, un oiseau !\"")
Il s'exclama : "Regarde, un oiseau !"
De la même manière, si l’on utilise les apostrophes comme délimiteurs de chaîne, toute apostrophe à l’intérieur de la chaîne de caractères devra être échappée.
print('Il s\'exclama : "Regarde, un oiseau !"')
Parmi les autres séquences d’échappement courantes, on mentionnera le retour à la ligne, que l’on écrit \n
, et la tabulation (pour l’indentation du texte), représentée par \t
.
print("3 * 3 =\n\t9")
3 * 3 =
9
Il existe de nombreuses autres séquences d’échappements qui ne seront pas toutes abordées dans ce cours.
Les chaînes de caractères formatées¶
Important
Les chaînes de caractères formatées sont un concept récent introduit dans la version 3.6 de Python. Les versions antérieures proposent d’autres méthodes de formatage, notamment la méthode str.format().
La principale méthode de formatage de chaînes en Python consiste en l’utilisation des chaînes de caractères formatées (« f-strings » en anglais).
Il s’agit de chaînes de caractères précédées de la lettre f
, de la manière suivante.
print(f"Je suis une chaîne formatée")
Je suis une chaîne formatée
Ce que les chaînes de caractères formatées offrent de plus que les chaînes habituelles est la possibilité d’y insérer le résultat de n’importe quelle expression Python.
Il suffit pour cela d’écrire les expressions à insérer entre deux accolades ({
, }
) aux endroits désirés, à l’intérieur de la chaîne formatée.
age = 20
years = 17
print(f"J'ai actuellement {age} ans et dans {years} ans j'en aurai {age + years} !")
J'ai actuellement 20 ans et dans 17 ans j'en aurai 37 !
Dans cette exemple on crée tout d’abord deux variables, la première contenant un âge et la seconde un nombre d’années. On affiche ensuite une chaîne de caractères formatées dans laquelle sont insérées les deux variables, l’une puis l’autre, et enfin leur somme.
Le code ci-dessous présente autre exemple où l’on insère cette fois une chaîne de caractères et un nombre.
name = "pi"
value = 3.1415
print(f"La valeur de {name} est approximativement {value}")
La valeur de pi est approximativement 3.1415
Formatage de nombres¶
Considérons l’exemple d’un école dans lequel se trouvent des filles et des garçons. On souhaite déterminer la proportion de filles avec une précision de deux décimales puis, à partir de cette valeur, le pourcentage de filles.
girls = int(input("Quel nombre de filles ? "))
boys = int(input("Quel nombre de chats ? "))
ratio_girls = girls / (girls + boys)
print(f"La proportion de filles est de {ratio_girls:.2}")
print(f"Le pourcentage de filles est de {ratio_girls:.2%}")
Quel nombre de filles ? 213
Quel nombre de garçons ? 189
La proportion de filles est de 0.53
Le pourcentage de filles est de 52.99%
Dans cet exemple, on commence par demander à l’utilisateur le nombre de chaque type d’enfant. On déclare ensuite une nouvelle variable dans laquelle on calcule la proportion de filles par rapport au total. Puis, on affiche une chaîne de caractères dans laquelle on insère le résultat avec une précision de deux décimales.
La syntaxe est la même que pour l’exemple précédent, avec une spécificité pour que notre valeur de type float
puisse avoir une précision de deux décimales.
À l’intérieur des accolades, le symbole :
signifie que l’on souhaite préciser le format.
Le point suivi d’un chiffre spécifie le nombre de décimales à afficher (ici .2
) .
Finalement on affiche le pourcentage de chiens avec la même méthode à la différence que, pour convertir la proportion en pourcentage, on spécifie le mode d’affichage avec le symbole %
après avoir indiqué la précision.
Les principaux types d’affichage disponibles pour les nombres décimaux sont résumés dans la table ci-dessous.
Le symbole terminal (g
, d
, f
, e
, %
) indique le format à utiliser pour afficher le nombre décimal.
En son absence, l’affichage utilise le format général qui choisit la plus appropriée entre la notation à virgule fixe et la notation scientifique.
Modes d’affichage pour les nombres décimaux
Symbole |
Affichage |
---|---|
|
format général (par défaut) |
|
entier décimal |
|
notation à virgule fixe |
|
notation scientifique |
|
pourcentage |
Nous pouvons comparer les différents types d’affichages dans les exemples suivants.
>>> print(f"{10:d}")
10
>>> print(f"{10:f}")
10.000000
>>> print(f"{10:.2f}")
10.00
>>> print(f"{10:.2e}")
1.00e+01
>>> print(f"{10:.2%}")
1000.00%
>>> print(f"{10/2:g}")
5
>>> print(f"{10/3:g}")
3.33333
Il est également possible d’afficher des grands nombres avec des séparateurs de milliers (la virgule en anglais) que l’on indique après le symbole :
.
Dans l’exemple suivant on souhaite afficher le nombre d’habitants en Allemagne, formaté avec des séparateurs de milliers.
germans = 84000000
print(f"L'Allemagne compte environ {germans:,} habitants")
L'Allemagne compte environ 84,000,000 habitants
Alignement¶
Il est possible de positionner les valeurs à afficher dans un champ de texte de dimension donnée en indiquant, juste après le symbole :
, le nombre de caractères à réserver pour l’affichage.
Dans le cas où l’affichage nécessite moins de caractères, des espaces seront ajoutés afin de remplir le champ.
Cela permet notamment d’afficher des valeurs en colonnes, comme dans l’exemple suivant.
print(f" Nombre Carré Moitié")
for x in range(1, 11):
print(f"{x:8d}{x*x:8d}{x/2:8.1f}")
Nombre Carré Moitié
1 1 0.5
2 4 1.0
3 9 1.5
4 16 2.0
5 25 2.5
6 36 3.0
7 49 3.5
8 64 4.0
9 81 4.5
10 100 5.0
On notera que des espaces ont été ajoutés avant les valeurs numériques afin de les aligner à droite.
Il est possible de contrôler la position des valeurs à afficher en utilisant l’un de symboles suivants juste avant de spécifier la dimension du champ : <
pour aligner à gauche, >
pour aligner à droite et ^
pour centrer.
En l’absence de symbole, les valeurs numériques sont alignées à droite et les chaînes de caractères à gauche.
Dans l’exemple suivant nous allons aligner des chaînes de caractères dans un champ de dimension 30 et des valeurs entières dans un espace de dimension 5.
print(f'[{"aligné à gauche":<30}] [{-1:<5}]')
print(f'[{"aligné à droite":>30}] [{1:>5}]')
print(f'[{"aligné au centre":^30}] [{0:^5}]')
[aligné à gauche ] [-1 ]
[ aligné à droite] [ 1]
[ aligné au centre ] [ 0 ]
4.3.6. Les chaînes de caractères sur plusieurs lignes¶
On peut déclarer une longue chaîne de caractère sur plusieurs lignes afin d’améliorer la lisibilité du code. Il existe pour cela plusieurs méthodes. L’exemple ci-dessous en illustre deux : l’usage des parenthèses et de la barre oblique inversée.
str1 = ("Je suis une longue chaîne de caractères "
"écrite sur plusieurs lignes "
"à l'aide des parenthèses")
str2 = "Je suis une autre longue chaîne de caractères " \
"écrite sur plusieurs lignes " \
"à l'aide de la barre oblique inversée"
str3 = (f"Ces deux méthodes s'appliquent aussi aux "
f"chaînes de caractères formatées")