[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Programmation
> Python
> Apprenons Python ! > Le début, la base de tout... > Les chaînes de caractères
> Lecture du tutoriel
Les chaînes de caractères
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Jusqu'à maintenant, nous avons manipulé des nombres (entiers, ou à virgule).
C'est un bon début, mais il existe d'autres types de données avec lesquels nous devons nous familiariser.
Parmi eux, il y'a les chaînes de caractères. Dans ce nom plus ou moins barbare, on reconnaît le mot "caractère" : c'est désormais à des lettres que nous allons avoir affaire. Comme ce ne sont pas des nombres, il va nous falloir apprendre plusieurs nouvelles choses. Le mot "chaîne", lui, signifie que l'on traite un ensemble de lettres, et plus une seule.
Tout d'abord, il faut savoir que dans une chaîne de caractères, vous pouvez tout stocker, tant que l'encodage le permet. L'encodage, c'est la façon dont la machine se représente les caractères. Vous savez en effet que les ordinateurs ne sont capables de traiter que des nombres ; l'encodage est la règle qui leur permet de convertir leur nombre dans nos symboles.
Voici une petite annexe sur l'encodage 
.
Si vous pouvez vraiment tout mettre, en revanche, il ne faut pas vous attendre à ce que Python comprenne ce qu'il y'a marqué : si vous avez écrit un nombre dans une chaîne, Python identifiera la chaîne, mais pas le nombre contenu dans la chaîne. C'est un peu comme si vous écriviez quelque chose sur une feuille un lundi, que vous rajoutiez quelque chose un mardi sans marquer de séparation, et qu'après vous ne sachiez plus séparer les deux jours le mercredi. Ainsi, Python ne pourra pas compter avec des nombres contenus dans des chaînes de caractères - il faudra les en extraire (ce qui n'est pas si difficile)
Vous savez déjà utiliser des chaînes dans vos programmes : il suffit d'entourer du texte avec les guillemets. Par exemple, dans
Code : Python
Python peut distinguer le code du texte, car le texte est entre guillemets.
On peut créer des variables à volonté de la même façon :
Code : Python1
2 | maChaine = "Salut les gens !"
print maChaine
|
Vous comprenez ici que Python va d'abord analyser la ligne entière, et "calculer" la chaîne (il va créer un objet chaîne en mémoire. Je ne détaille pas le procédé, qui est
intéressant passionant, mais incompréhensible pour nous, humbles débutants

) et va tout de suite la rattacher à une nouvelle variable nommée maChaine. Ensuite, nous pouvons l'afficher tout simplement.
Autant que je vous le dise tout de suite, les chaînes sont extrèmement utilisées. La preuve, combien de programmes que vous possédez n'affiche jamais de caractères

? Pour cette raison, Python possède énormément de matériel pour les traiter - nous ne pouvons tout voir en une fois. Commençons par la base : comment lire du texte entré par l'utilisateur ?
Vous connaissez déjà la fonction input qui permet à l'utilisateur d'entrer des nombres. Hé bien en fait, la fonction
input accepte toutes les entrées. Depuis la ligne de commande Python, nous allons faire des tests :
Code : Python 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | >>> print input("Entrez quelque chose : ")
Entrez quelque chose : 5
5
>>> print input("Entrez quelque chose : ")
Entrez quelque chose : 14.3
14.3
>>> print input("Entrez quelque chose : ")
Entrez quelque chose : 47+5
52
>>> print input("Entrez quelque chose : ")
Entrez quelque chose : Une chaine sans guilleemets !
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<string>", line 1
Une chaine sans guilleemets !
^
SyntaxError: invalid syntax
>>> print input("Entrez quelque chose : ")
Entrez quelque chose : "Une chaine avec des guillemets"
Une chaine avec des guillemets
|
Hé oui,
input permet d'entrer de vraies expression en Python !
Cela pose deux problèmes :
- Si on veut lire une chaîne de caractères, il faut que l'utilisateur rentre son texte entouré de guillemets... ce qui n'est pas pratique pour lui. En effet, vous voyez qu'à l'endroit où je ne mets pas de guillemets, Python me parle de "SyntaxError". En revanche, si j'en mets, tout est normal.
- Surtout, comme Python est un langage interprété, il y'a possibilité pour un utilisateur averti de rentrer du code ! Vous voyez qu'ici j'ai rentré une petite opération (47+5) et qu'elle est immédiatement calculée. Mais on peut en fait demander n'importe quoi à Python, avec un peu d'ingéniosité.
Nous allons voir la fonction raw_input qui, elle, sert exclusivement à lire du texte, et est à 100% fiable. Vous pouvez déjà l'utiliser comme input. Voici un programme exemple :
Code : Python1
2
3 | print "Bonjour ! Quel est ton nom ?"
nom = raw_input()
print "Ah ! tu t'appelles", nom
|
Vous voyez, les chaînes de caractères sont, pour des opérations basiques, identiques aux nombres pour ce qui est de leur manipulation. Notez qu'on peut, comme toujours, composer les instructions :
Code : Python1
2 | print "Bonjour ! Quel est ton nom ?"
print "Ah ! tu t'appelles", raw_input()
|
Et on fait ainsi l'économie d'une variable.
Et pour l'addition des chaînes, alors ?
Comme nous l'avons vaguement dit, il est possible d'additionner deux chaînes.

Mais ça n'a pas le même sens que pour les nombres, naturellement. En fait, on appelle ça une "concaténation", et c'est en réalité une fusion de deux chaînes. Dans certains langages (Caml par exemple) elles se font à l'aide d'un opérateur particulier. Dans d'autres, c'est carrément une fonction qui le fait. En Python, grâce à un mécanisme que nous verrons beaucoup plus tard (nommé "surcharge des opérateurs"), cela se fait tout simplement avec l'opérateur '+'. Petite démonstration :
Code : Python1
2
3 | nom = raw_input()
message = "Bonjour " + nom
print message
|
Les deux chaînes ont été correctement ajoutées l'une à l'autre

Cet exemple est peu utile, car on aurait aussi bien fait avec une virgule, dans print. Mais dans le futur, il faudra vous habituer à utiliser cet opérateur.
Il y'a un autre opérateur utilisable, cette fois-ci avec une chaîne et un entier. Il s'agit de la répétition, utilisant le '*'. Regardez le programme suivant, qui vous fera récapituler au passage :
Code : Python1
2
3
4
5
6 | print "Ce programme est très poli. Combien de fois va-t'il dire bonjour ?"
nombre = input()
if nombre > 0:
print "Bonjour ! " * nombre
else:
print "Vous ne voulez pas être salué ? Ok"
|
Notez que pour les nombres, on peut continuer à utiliser input, en priant pour que l'utilisateur ne fasse pas de bêtise (sans quoi le programme se terminerait immédiatement sur une erreur, ou partirait sur un autre code). Mais si vous avez peur et que vous souhaitez empêcher tout détournement, il y'a toujours moyen de récuperer une chaîne fiable avec raw_input, et de la convertir en nombre, avec une nouvelle fonction nommée int, qui prend une chaîne ou un nombre en argument, et renvoie un nombre. Ainsi, notre programme devient
Code : Python1
2
3
4
5
6
7 | print "Ce programme est très poli. Combien de fois va-t'il dire bonjour ?"
chaine = raw_input()
nombre = int(chaine) # On transforme chaine en entier si possible
if nombre > 0:
print "Bonjour ! " * nombre
else:
print "Vous ne voulez pas être salué ? Ok"
|
Ou encore plus simplement
Code : Python1
2
3
4
5
6 | print "Ce programme est très poli. Combien de fois va-t'il dire bonjour ?"
nombre = int(raw_input())
if nombre > 0:
print "Bonjour ! " * nombre
else:
print "Vous ne voulez pas être salué ? Ok"
|
Observez bien la deuxième ligne : Python va l'analyser, et repérer l'appel de la fonction raw_input *dans* les arguments de la fonction int. Cela veut dire "Appelle raw_input et passe le résultat en argument à int".
Souvenez vous du schéma avec input, dans le chapitre des boucles... Ici, on peut doubler le schéma, en mettant une flêche qui indique le résultat de raw_input, et qui va directement dans les arguments de int.
Puis le résultat final (notre entier) est stocké dans la variable nombre
Hélas si l'utilisateur rentre une bêtise, nous ne pouvons toujours pas la contrôller pour l'instant, et empêcher un plantage. Mais au moins, l'utilisateur rentrera son nombre, ou n'utilisera pas le programme
Notez l'existence de la fonction inverse, str, qui elle transforme une donnée en chaîne, ainsi que de la fonction float, qui ne produit pas un entier mais un nombre à virgule.
Comme dans beaucoup de langages, les chaînes de caractères peuvent être considérés comme ce qu'on appelle des
tableaux. C'est à dire qu'on peut schématiser la chaîne en tableau de deux colonnes, l'une contenant des nombres augmentant de 1 à chaque ligne appelés "indexes", l'autre contenant les caractères. Vous l'aurez peut-être deviné, les nombres servent à repérer les caractères. Voici un petit schéma de la chaîne "Bonjour !" :

Comme vous voyez, on peut associer à chaque caractère un index, en partant de 0 pour le premier. Et alors, il devient possible de demander à Python d'extraire certains caractères, en utilisant une syntaxe un peu particulière :
Citation : maChaine[i : int] -> renvoie le caractère numéro i
Ceci ne veut pas dire que le nombre entre crochet est une variable int nommée i, hein

C'est simplement une façon de noter qu'entre les crochets on doit trouver un nombre entier, ou un calcul dont le résultat est un entier (comme nous le verrons plus tard).
Par exemple, avec le programme suivant
Code : Python1
2
3 | print "Entrez votre nom s'il vous plaît"
nom = raw_input()
print "Votre nom commence par un", nom[0]
|
Arrivé à la troisième ligne, Python prend le premier caractère du nom (le caractère n°0, donc celui qui se trouve au début), et le donne à print pour qu'il soit affiché. Toutefois, ce programme est susceptible de ne pas fonctionner : si l'utilisateur appuie directement sur entrée, on obtiendra une chaîne particulière, qui est dite "vide" (car elle ne contient rien

).
Alors, lorsque Python essaiera de prendre le premier caractère du nom :
Code : Python1
2
3 | Traceback (most recent call last):
File "<stdin>", line 1, in ?
IndexError: string index out of range
|
Ce qui veut dire que vous avez cherché votre caractère trop loin, car l'index était supérieur à la taille de la chaîne - donc que vous avez demandé un numéro qui n'existait pas. Il nous faudrait donc être capables de mesurer la chaîne, et de signaler à l'utilisateur qu'il utilise mal le programme si jamais la chaîne est vide.
Python met à disposition la fonction len, qui mesure une chaîne (ou d'autres éléments, encore une fois on attendra d'en savoir un peu plus

) que l'on passe en argument, et qui renvoie la longueur mesurée. Plus clairement, entre parenthèses vous mettez la chaîne, et len calculera la taille, en comptant le nombre de caractères, que vous pourrez utiliser directement de l'endroit où vous appelez len, ou après avoir stocké la longueur dans une variable.
Citation : len(maChaine : str) -> taille : entier
Cette notation signifie que lorsqu'on lui passe une chaîne (de type "str"), len renvoie sa taille.
Nous pouvons ensuite vérifier que la taille n'est pas égale à 0 avec une condition. Nouvelle version :
Code : Python1
2
3
4
5
6 | print "Entrez votre nom s'il vous plaît"
nom = raw_input()
if len(nom) > 0: # Si la longueur du nom est supérieure à 0 (c'est tout à fait lisible non ?)
print "Votre nom commence par un", nom[0]
else:
print "Vous préférez l'anonymat ?"
|
On peut même l'enrichir :
Code : Python1
2
3
4
5
6
7 | print "Entrez votre nom s'il vous plaît"
nom = raw_input()
longueur = len(nom)
if longueur > 0:
print "Votre nom commence par un", nom[0], "et mesure", longueur, "caractères !"
else:
print "Vous préférez l'anonymat ?"
|
Notez que dans le programme précédent, nous n'avions pas créé de variable longueur, mais directement utilisé len(nom) là où nous en avions besoin. Ici, nous utilisons deux fois la longueur : il est donc préférable de ne pas écrire deux fois le même appel de fonction, mais plutôt de stocker la longueur dans une variable si elle doit être réutilisée.
Il est possible d'utiliser n'importe quel index tant qu'il ne dépasse pas la taille de la chaîne, et cette taille est donnée par len. Toutefois, regardons quelque chose à la ligne de commande :
Code : Python1
2
3
4
5 | >>> maChaine = "bonjour"
>>> len(maChaine)
7
>>> maChaine[6]
'r'
|
Vous l'aurez compris (déjà rien qu'au titre

), len donne la taille de la chaîne en commençant à 1 (puisque 0 n'est donné que si la chaîne est vide). Dans cet exemple, "bonjour", fait 7 caractères de long. Faites attention à cela, c'est bête mais c'est méchant
Par exemple, si nous avions voulu accéder au caractère qui se trouve au milieu de la chaîne, on aurait pu penser que son index était égal à la longueur de la chaîne divisé par 2 (la moitié quoi). Hors si on prend une chaîne de longueur 6, le caractère qui se trouve au milieu est le troisième - c'est à dire celui dont l'index est 2 (car l'index commence à 0).
Donc nous aurions du :
- calculer la longueur de la chaîne (ici, 6)
- lui enlever 1 (ici, 6 - 1 = 5)
- diviser le résultat par 2 (5 divisé par 2 = 2.5). Comme Python coupe la partie décimale quand on ne calcule qu'avec des entiers, on aurait bien récuperé l'index, et non pas un nombre à virgule.
Ça n'est pas évident à retenir, regardez ce qui suit :
Code : Python1
2
3
4
5
6
7
8
9 | chaine1 = "bonbon" # Test avec un nombre pair de caractères
chaine2 = "bonjour" # Test avec un nombre impair de caractères
long1 = len(chaine1)
long2 = len(chaine2)
index1 = (long1 - 1)/2
index2 = (long2 - 1)/2
car1 = chaine1[index1]
car2 = chaine2[index2]
print "Voici les caractères qui se situent aux milieux des deux chaînes :", car1, "et", car2
|
Vous devriez vraiment comprendre cela avant de passer à la suite (même si c'est beaucoup moins compliqué après, pas de panique !

), quitte à faire une pause dans le chapitre (après tout, nous avons déjà vu plein de choses). Ici, il y'a deux chaînes dont nous trouvons les deux milieux selon le procédé qui se trouve au dessus.
Il y'a moyen de sensiblement diminuer le nombre de lignes de code. En effet, le nombre entre les crochets à côté de chaine1 et chaine2 est obtenu à partir d'une variable. Mais nous ne sommes pas obligés de calculer l'index du caractère en milieu de chaîne à l'extérieur de ces crochets - en d'autres termes, le code qui correspond à notre calcul peut être écrit de façon plus courte car il utiliserait alors moins de variables :
Code : Python1
2
3
4
5
6
7 | chaine1 = "bonbon" # Test avec un nombre pair de caractères
chaine2 = "bonjour" # Test avec un nombre impair de caractères
long1 = len(chaine1)
long2 = len(chaine2)
car1 = chaine1[(long1 - 1)/2]
car2 = chaine2[(long2 - 1)/2]
print "Voici les caractères qui se situent aux milieux des deux chaînes :", car1, "et", car2
|
On vient de supprimer une étape, en diminuant la taille du code - mais en perdant en lisibilité. Bien sûr, vous pouvez maintenant remplacer long1 et long2 par len(chaine1) et len(chaine2) directement entre les crochets, et même ne pas passer par les variables car1 et car2 :
Code : Python1
2
3 | chaine1 = "bonbon" # Test avec un nombre pair de caractères
chaine2 = "bonjour" # Test avec un nombre impair de caractères
print "Voici les caractères qui se situent aux milieux des deux chaînes :", chaine1[(len(chaine1) - 1)/2], "et", chaine2[(len(chaine2) - 1)/2]
|
Notre code devient tout simplement illisible
Mais savoir écrire des expressions de cette complexité est important, car cela montre que vous comprenez bien ce qui se passe (le tout est de savoir ce qui est lu par Python en premier, puis ce que cela donne, etc...). Trop de déclarations de variables alourdissent le code, prenez-en bonne note
Comme nous avons appris à faire des boucles équipées de compteurs, nous pouvons les utiliser pour parcourir une chaîne.
Parcourir ?
Oui parcourir une chaîne. C'est-à-dire passer par chaque caractère de la chaîne. Petit exemple :
Code : Python1
2
3
4
5
6 | maChaine = "Salut !"
compteur = 0
longueurChaine = len(maChaine) # Combien de caracteres dans la chaine ?
while compteur < longueurChaine:
print maChaine[compteur]
compteur = compteur + 1
|
Simple non ? On crée une chaîne (maChaine) et un compteur (compteur), ainsi qu'une variable qui va contenir la longueur de la chaîne (longueurChaine). On va afficher le caractère dont le numéro correspond au compteur jusqu'a ce que compteur soit égal à longueurChaine. A ce moment, la condition n'est plus vérifiée, et on sort de la boucle. En effet, si on écrit
Code : Python
alors que compteur est égal à longueurChaine, on dépasse de la chaîne, comme nous venons de le voir.
Nous allons créer un programme qui reprend la forme du précédent, mais qui, au lieu d'afficher les caractères un par un (ce qui est peu intéressant) compte le nombre d'apparitions d'un certain caractère. Comment faire pour cela ? Il suffit de parcourir la chaîne caractère après caractère, et de tester s'ils sont égaux à celui que l'on cherche. Encore une fois, en Python, cela se fait plus simplement que dans d'autres langages, puisque dans certains les comparaisons avec les chaînes sont difficiles à mettre en oeuvre : ici, un == suffit
Pour compter le nombre de fois où on trouve le caractère recherché, on utilisera la variable nombreCar.
Code : Python 1
2
3
4
5
6
7
8
9
10 | maChaine = "Les chaussettes de l'archi-duchesse sont-elles seches et archiseches"
car = "e"
compteur = 0
nombreCar = 0
longueurChaine = len(maChaine)
while compteur < longueurChaine:
if maChaine[compteur] == car: # Si on a bien trouvé le caractère cherché
nombreCar += 1
compteur += 1
print "On a trouvé", nombreCar,"fois le caractère",car
|
Si vous êtes observateur, vous avez découvert une nouveauté : le +=. Que signifie-t'il ?
Hé bien c'est simplement une forme condensée de = et +, pour éviter d'écrire nombreCar = nombreCar + 1. Cela revient strictement au même, vous pouvez utiliser celui que vous préférez. Il existe naturellement aussi des opérateurs -=, *=, /= et %=
Notre programme va donc parcourir la chaîne, et ajouter 1 à nombreCar à chaque fois qu'il trouvera le caractère recherché.
Vous voici un peu plus au point sur les chaînes. Il vous reste encore plein de notions à apprendre, mais nous les verrons plus tard. Les chaînes sont omniprésentes : il faut savoir les utiliser en Python, d'autant plus que ce langage nous donne plein d'outils pour leur manipulation.
- input est plus facile à utiliser pour des entrées de nombres, mais si l'utilisateur rentre n'importe quoi, Python arrêtera le programme
- raw_input, elle, sert exclusivement au texte
- On peut transformer du texte en nombre avec la fonction int (il existe aussi une fonction float, qui transforme le texte en nombres à virgule), et des nombres en texte avec str.
- Les chaînes peuvent être considérées comme des tableaux, c'est à dire qu'on peut accéder à leurs caractères individuellement en précisant leur place, nommée index
- Cet index commence à 0 pour le premier caractère, et est donné entre crochets à côté de la chaîne manipulée. C'est obligatoirement un entier.
- Il ne faut pas que l'index dépasse la fin de la chaîne.
- La fonction len permet de mesurer une chaîne. Elle renvoie un entier. Il faut faire attention à ne pas utiliser le résultat de len entre les crochets, car l'index serait trop grand.
- Il est facile de faire des boucles pour parcourir une chaîne et analyser les éléments qu'elle contient.
- Reprenez le programme indiquant la première lettre et la longueur d'un nom, et faites en sorte qu'il n'affiche pas de s à "caractère" si jamais le nom ne fait qu'une lettre de long.
- Reprenez le programme donné à la fin, et permettez à l'utilisateur d'entrer la chaîne et le caractère de son choix. Profitez-en pour faire des tests afin de vérifier que c'est bien un seul caractère qui a été rentré, et non-plusieurs (ou aucun).
- Faites un programme qui parcourt une chaîne dans lequelle on trouve plusieurs #, et qui affiche ce qu'il y'a entre ces #. Par exemple, avec la chaîne "pigeon#poulet#potiron", votre programme doit afficher les trois mots séparément, et sans dièses.
- Reprenez le programme de l'exercice précédent et permettez à l'utilisateur de choisir le caractère de séparation.
- Affichez une pyramide en effectuant des répétitions de chaîne
Certains de ces programmes ne sont pas faciles à réaliser, n'hésitez pas à demander de l'aide sur le forum, sur IRC ou à des amis. Vous pouvez aussi envoyer un MP aux rédacteurs du cours, mais attention ! Certains peuvent partir en vacances

De plus, l'aide qu'on vous donne sur un forum peut être réutilisée, pas celle qui passe par MP.
Nous corrigeons ici le troisième exercice, à mon avis le plus compliqué. Si vous n'avez pas réussi, dites vous simplement que vous n'avez pas encore l'habitude
Secret (cliquez pour afficher)D'abord, laissez moi vous dire que tout cela tient vraiment de l'entraînement, car une fonction produisant un effet comparable existe déjà (pour les connaisseurs, c'est une méthode des chaînes). Il est très utile de savoir coder ce qui existe déjà, parce que ça apprend plein de choses
Ensuite, le fonctionnement : il suffisait de parcourir la chaîne à la recherche des #, qui délimitent les sous-chaînes. Donc, analyser les caractères un par un était une bonne stratégie : si le caractère n'est pas un #, il suffit de le stocker.
Où ça ? Dans une variable temporaire, c'est à dire une variable dans laquelle le programme stocke ce sur quoi il est en train de travailler. A chaque caractère, on va reprendre la variable, et la concaténer avec le caractère en question, jusqu'au #, où on affichera le morceau découpé. Petit exemple de ce que ça donnerait pour la chaîne "test#retest":
Début de la boucle : varTempo = ""
Tour de boucle n°1 : varTempo = "" + "t"
Tour de boucle n°2 : varTempo = "t" + "e"
Tour de boucle n°3 : varTempo = "te" + "s"
Tour de boucle n°4 : varTempo = "tes" + "t"
Tour de boucle n°5 : varTempo = "test" Ici on rencontre un #, donc on affiche la chaîne et on vide la variable
Tour de boucle n°6 : varTempo = "" + "r" Puis on fait de même avec le morceau suivant
etc...
Code : Python 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/usr/bin/python
maChaine = "poisson#courge#salade#"
long = len(maChaine)
compteur = 0
chaineTemporaire = ""
while compteur < long:
car = maChaine[compteur] # On stocke le caractère courant
if car == "#":
print chaineTemporaire
chaineTemporaire = ""
else:
chaineTemporaire += car # On ajoute le caractère courant à la chaine
compteur += 1
|
Ce code n'est pas parfait, loin de là. Notamment, si la chaîne ne finit pas par un #, il n'affiche pas la dernière chaîne relevée. De plus, si on trouve deux # à la suite ou un au début, ce sont des print de lignes vide qui seront faits.
Améliorez le
Vous voici un peu plus au point sur les chaînes. Il vous reste encore plein de notions à apprendre, mais nous les verrons plus tard. Les chaînes sont omniprésentes : il faut savoir les utiliser en Python, d'autant plus que ce langage nous donne plein d'outils pour leur manipulation.
Ce chapitre était compliqué - peut-être même que c'est le pire de la partie 1. Il présente des bases auxquelles nous ne pouvons échapper, mais qui seront réutilisées par la suite. Il vous faudra sans doute revenir dessus en cas de pépin