06 - Chaînes de caractères

Vidéo : les chaînes de caractères en Python (3 min 41)

Définition

Une chaîne de caractères (type str) est une séquence de caractères. C’est le type utilisé par Python pour représenter du texte : un prénom, une phrase, un mot de passe, une adresse e-mail, etc.

On crée une chaîne en plaçant du texte entre guillemets " ou apostrophes ' :

prenom = "Alice"
ville = 'Paris'
print(f"{prenom} habite à {ville}")
Alice habite à Paris

Les deux notations sont équivalentes. Les guillemets doubles sont pratiques lorsque la chaîne contient une apostrophe, et inversement :

phrase1 = "L'informatique est passionnante"
phrase2 = 'Il a dit "bonjour" en entrant'
print(phrase1)
print(phrase2)
L'informatique est passionnante
Il a dit "bonjour" en entrant

Si une chaîne doit contenir à la fois des guillemets et des apostrophes, on utilise le caractère d’échappement \ :

mixte = "Elle a dit : \"c'est formidable\""
print(mixte)
Elle a dit : "c'est formidable"

Longueur d’une chaîne

La fonction len() renvoie le nombre de caractères d’une chaîne :

mot = "Python"
print(len(mot))       # 6

vide = ""
print(len(vide))      # 0
phrase = "Bonjour !"
print(len(phrase))

Question. Quel nombre s’affiche ?

Réponse
9

Tous les caractères comptent, y compris l’espace et le point d’exclamation : B, o, n, j, o, u, r, l’espace et ! font 9 caractères.

Lire un caractère avec son indice

Les caractères d’une chaîne sont numérotés à partir de zéro : chaque caractère a un indice. Les indices négatifs comptent à partir de la fin : -1 désigne le dernier caractère, -2 l’avant-dernier.

On lit un caractère en indiquant son indice entre crochets, après la chaîne :

mot = "Python"
print(mot[0])    # premier caractère
print(mot[3])    # quatrième caractère
print(mot[-1])   # dernier caractère
print(mot[-2])   # avant-dernier
P
h
n
o

Question. Que vaut mot[2] ?

Réponse

't' : l’indice 2 désigne le troisième caractère, puisque le premier a l’indice 0.

Attention au dernier indice

Le mot "Python" contient 6 caractères : ses indices vont donc de 0 à 5. Demander l’indice 6, c’est chercher un caractère qui n’existe pas, et Python s’arrête avec une erreur :

mot = "Python"
print(mot[6])
IndexError: string index out of range

À retenir : les indices valides d’une chaîne s vont de 0 à len(s) - 1. Pour lire le dernier caractère, le plus simple est d’écrire s[-1].

Une chaîne ne se modifie pas

Les chaînes sont immuables : on ne peut pas modifier un caractère en place. Pour transformer "Python" en "Jython", on essaie de remplacer le premier caractère :

mot = "Python"
mot[0] = "J"
TypeError: 'str' object does not support item assignment

Python refuse. Pour obtenir une chaîne modifiée, il faut en construire une nouvelle :

mot = "Python"
nouveau = "J"
for i in range(1, len(mot)):   # tous les caractères sauf le premier
    nouveau = nouveau + mot[i]
print(nouveau)
Jython

La boucle ajoute un à un, à la fin de nouveau, les caractères d’indice 1 à 5 de mot. La chaîne mot, elle, n’a pas changé.

Concaténation et répétition

L’opérateur + concatène (assemble) deux chaînes, et l’opérateur * répète une chaîne :

prenom = "Ada"
nom = "Lovelace"
complet = prenom + " " + nom
print(complet)      # Ada Lovelace

tirets = "-" * 20
print(tirets)       # --------------------

motif = "ab" * 4
print(motif)        # abababab
print("ha" * 3 + "!")

Question. Qu’affiche cette ligne ?

Réponse
hahaha!

Comme pour les nombres, la répétition * passe avant la concaténation + : Python calcule d’abord "ha" * 3, soit "hahaha", puis ajoute "!".

Attention : on ne peut pas concaténer une chaîne et un nombre directement.

age = 17
print("J'ai " + age + " ans")
TypeError: can only concatenate str (not "int") to str

Il faut d’abord convertir le nombre en chaîne avec str(), ou utiliser une f-string :

age = 17
print("J'ai " + str(age) + " ans")  # correct
J'ai 17 ans

Les f-strings

Les f-strings (chaînes formatées, depuis Python 3.6) permettent d’insérer des variables et des expressions directement dans une chaîne, en les plaçant entre accolades {} :

prenom = "Alice"
age = 17
print(f"{prenom} a {age} ans")
print(f"Dans 10 ans, {prenom} aura {age + 10} ans")
Alice a 17 ans
Dans 10 ans, Alice aura 27 ans

On peut aussi contrôler le format d’affichage :

import math

# Arrondir un flottant
print(f"Pi vaut environ {math.pi:.2f}")    # 3.14

# Aligner à droite sur 10 caractères
print(f"{'Alice':>10}")                     #      Alice

# Afficher un pourcentage
ratio = 0.85
print(f"Réussite : {ratio:.0%}")            # Réussite : 85%
Pi vaut environ 3.14
     Alice
Réussite : 85%

Caractères spéciaux

Certains caractères ne sont pas directement saisissables. On les écrit à l’aide de séquences d’échappement commençant par \ :

SéquenceSignification
\nRetour à la ligne
\tTabulation
\\Le caractère \ lui-même
\'Apostrophe
\"Guillemet
print("Ligne 1\nLigne 2")
print("Nom\tPrénom\tÂge")
print("Alice\tDupont\t17")
Ligne 1
Ligne 2
Nom	Prénom	Âge
Alice	Dupont	17

Chaînes multilignes

Pour écrire une chaîne sur plusieurs lignes, on utilise les triples guillemets """ ou ''' :

poeme = """Ceci est un texte
qui s'étend sur
plusieurs lignes."""
print(poeme)
Ceci est un texte
qui s'étend sur
plusieurs lignes.

Chercher un texte dans un autre

L’opérateur in teste si une sous-chaîne est présente dans une chaîne. Il répond par un booléen.

phrase = "Bienvenue en NSI"
print("NSI" in phrase)
print("nsi" in phrase)

Question. Que renvoient ces deux tests ?

Réponse
True
False

"NSI" figure bien dans la phrase. En revanche, "nsi" en minuscules n’y figure pas : le test distingue les majuscules des minuscules (on dit qu’il est sensible à la casse).

La sous-chaîne peut aussi se trouver au milieu d’un mot :

phrase = "Bienvenue en NSI"
print("venu" in phrase)     # True
print("z" not in phrase)    # True

À retenir

  1. Une chaîne de caractères s’écrit entre guillemets ou entre apostrophes ; len() donne son nombre de caractères, espaces compris.
  2. Chaque caractère a un indice, qui commence à 0 ; les indices négatifs comptent à partir de la fin, -1 désignant le dernier caractère.
  3. Les indices valides vont de 0 à len(s) - 1 : au-delà, Python affiche une erreur IndexError.
  4. Une chaîne est immuable : on ne peut pas modifier un caractère, on construit une nouvelle chaîne.
  5. + assemble deux chaînes, * répète une chaîne ; on ne peut pas ajouter un nombre à une chaîne sans le convertir avec str().
  6. Une f-string insère des valeurs dans une chaîne : f"{prenom} a {age} ans".
  7. in teste si un texte figure dans un autre, en distinguant majuscules et minuscules.

Résumé

OpérationSyntaxeExemple
Création"..." ou '...'"Bonjour"
Longueurlen(s)len("NSI") → 3
Accèss[i]"NSI"[0] → "N"
Immuabilitéon ne peut pas modifier s[i]construire une nouvelle chaîne
Concaténations1 + s2"Bon" + "jour" → "Bonjour"
Répétitions * n"ab" * 3 → "ababab"
Appartenancex in s"a" in "abc" → True
f-stringf"...{var}..."f"J'ai {age} ans"

La suite. Les méthodes de manipulation des chaînes (parcours, recherche, découpage, etc.) sont présentées dans le chapitre suivant : 07 - Chaînes : méthodes .