Ch. 03 · Leçon 5
Traitements sur chaînes de caractères
Ce que vous saurez faire
- Manipuler les chaînes par indice et par méthode
- Implémenter les traitements canoniques sur chaînes
- Comparer le traitement d'une chaîne et celui d'un tableau de caractères
- Concevoir un algorithme sur chaîne combinant plusieurs opérations
Plan de cours
26 lettres, 1 milliard de manipulations
Les chaînes de caractères sont partout : noms, mots de passe, URLs, textes lus, sorties affichées. Cette leçon clôt le chapitre Sous-programmes en appliquant les traitements de tableau aux chaînes — avec quelques pièges spécifiques.
Concepts clés
- Une chaîne = séquence de caractères indexés.
- Python : chaînes IMMUTABLES (pas de
s[0] = 'X'). - Traitements canoniques : longueur, recherche, comptage, inversion, concaténation.
- Méthodes natives :
upper,lower,find,split,replace, etc.
Avant de commencer
- Q1. Combien de caractères y a-t-il dans
"informatique"? - Q2. Comment accéder à la 3ème lettre d'une chaîne en Python ?
- Q3. Que retourne
"abc".upper()?
1. Le contenu du cours
1.1 Analogie : le collier de perles
Une chaîne est un collier de perles, chaque perle portant un caractère. Vous pouvez :
- Compter les perles (longueur),
- Examiner chaque perle (parcours),
- Chercher une perle particulière (recherche),
- Couper une partie (sous-chaîne),
- Assembler deux colliers (concaténation).
Mais en Python, vous ne pouvez pas remplacer une perle sans refaire entièrement le collier. C'est l'immuabilité.
1.2 Indexation et longueur
| Notion | Algo | Python |
|---|---|---|
Longueur de ch | LONG(ch) | len(ch) |
i-ème caractère | ch[i] (i ∈ [1, LONG]) | ch[i] (i ∈ [0, len-1]) |
| Dernier caractère | ch[LONG(ch)] | ch[-1] ou ch[len(ch)-1] |
Exemple
mot = "informatique"
print(len(mot)) # 12
print(mot[0]) # 'i' (premier en Python)
print(mot[-1]) # 'e' (dernier)
print(mot[3]) # 'o' (4ème en Python = 4ème en algo si on commence à 1... attention)
1.3 Parcours d'une chaîne
Par caractère (idiomatique Python)
mot = "Bonjour"
for c in mot:
print(c)
Affiche B, o, n, j, o, u, r (un par ligne).
Par indice (équivalent algorithmique)
mot = "Bonjour"
for i in range(len(mot)):
print(f"Position {i} : {mot[i]}")
Avec indice et valeur (enumerate)
for i, c in enumerate(mot):
print(f"{i} → {c}")
1.4 Méthodes natives essentielles
| Méthode Python | Effet | Exemple |
|---|---|---|
ch.upper() | Tout en majuscules | "info".upper() → "INFO" |
ch.lower() | Tout en minuscules | "INFO".lower() → "info" |
ch.capitalize() | Première en majuscule | "info".capitalize() → "Info" |
ch.find(s) | Position de s dans ch, -1 si absent | "abcdef".find("cd") → 2 |
ch.count(s) | Nombre d'occurrences de s | "abracadabra".count("a") → 5 |
ch.replace(a, b) | Remplace toutes les occurrences | "hello".replace("l", "x") → "hexxo" |
ch.split(sep) | Découpe en liste sur sep | "a,b,c".split(",") → ["a","b","c"] |
sep.join(L) | Joint une liste avec séparateur | "-".join(["a","b","c"]) → "a-b-c" |
ch.strip() | Enlève espaces (et \n) en début/fin | " hello ".strip() → "hello" |
1.5 Immuabilité des chaînes Python
Vous ne pouvez pas faire :
mot = "Bonjour"
mot[0] = 'b' # ERREUR : 'str' object does not support item assignment
Pour modifier, créez une nouvelle chaîne par concaténation ou slicing :
mot = "Bonjour"
nouveau = 'b' + mot[1:] # 'b' + 'onjour' = 'bonjour'
1.6 Les traitements canoniques
Compter une occurrence
def nb_occurrences(ch, c):
"""Compte combien de fois le caractère c apparaît dans ch."""
nb = 0
for x in ch:
if x == c:
nb = nb + 1
return nb
print(nb_occurrences("abracadabra", "a")) # 5
Inverser une chaîne
def inverser(ch):
"""Retourne ch inversée."""
resultat = ""
for c in ch:
resultat = c + resultat # ajoute en tête à chaque tour
return resultat
print(inverser("Bonjour")) # "ruojnoB"
Variante idiomatique :
def inverser(ch):
return ch[::-1] # slicing inversé
Tester si palindrome
def est_palindrome(ch):
"""Vrai si ch se lit pareil dans les 2 sens (casse ignorée)."""
ch = ch.lower()
return ch == ch[::-1]
print(est_palindrome("Kayak")) # True
print(est_palindrome("python")) # False
Compter les voyelles
def nb_voyelles(ch):
voyelles = "aeiouyAEIOUY"
nb = 0
for c in ch:
if c in voyelles:
nb = nb + 1
return nb
print(nb_voyelles("Informatique")) # 5
Vérifier si un caractère est une lettre / un chiffre
| Méthode | Vrai si… |
|---|---|
c.isalpha() | c est une lettre |
c.isdigit() | c est un chiffre 0-9 |
c.isalnum() | c est alphanumérique |
c.isupper() / c.islower() | c est majuscule / minuscule |
c.isspace() | c est un espace, tab, retour ligne |
1.7 Trace d'exécution — Inversion
Énoncé. Trace pour inverser("CHAT") (version par boucle).
| N° | Instruction | c | resultat |
|---|---|---|---|
| 01 | ··· | ? | ? |
| 02 | ··· | ? | ? |
| 03 | ··· | ? | ? |
| 04 | ··· | ? | ? |
| 05 | ··· | ? | ? |
2. Exercices pratiques
Niveau Débutant — Type bac courant
Écrire une fonction capitaliser(ch) qui retourne la chaîne avec uniquement la première lettre en majuscule, le reste en minuscules. Ne pas utiliser la méthode native capitalize().
Tester avec "informaTIQUE" → "Informatique".
Voir le corrigé
def capitaliser(ch):
if len(ch) == 0:
return ch
return ch[0].upper() + ch[1:].lower()
print(capitaliser("informaTIQUE")) # Informatique
print(capitaliser("")) # "" (cas limite)
Décomposition :
ch[0]→ premier caractère..upper()→ en majuscule.ch[1:]→ tout sauf le premier (slicing)..lower()→ tout en minuscules.- Concaténation avec
+.
Cas limite à tester : chaîne vide. Si on l'oublie, ch[0] provoque une IndexError.
Niveau Intermédiaire — Type bac difficile
Écrire une fonction nb_mots(phrase) qui retourne le nombre de mots dans une phrase. Un mot est une suite de caractères non-espace séparée par un ou plusieurs espaces. Les espaces en début/fin doivent être ignorés.
Tester :
"Bonjour le monde"→ 3" Bonjour le monde "→ 3 (espaces multiples et bordures)""→ 0" "→ 0
Voir le corrigé
Version 1 — méthode native (idiomatique)
def nb_mots(phrase):
return len(phrase.split())
print(nb_mots("Bonjour le monde")) # 3
print(nb_mots(" Bonjour le monde ")) # 3
print(nb_mots("")) # 0
print(nb_mots(" ")) # 0
split() sans argument découpe automatiquement sur n'importe quel ensemble d'espaces (un ou plusieurs) et ignore les espaces en début/fin. C'est exactement ce qu'on veut.
Version 2 — boucle manuelle (sans méthode magique)
def nb_mots(phrase):
"""Sans utiliser split()."""
nb = 0
dans_mot = False
for c in phrase:
if c != " " and not dans_mot:
nb = nb + 1
dans_mot = True
elif c == " ":
dans_mot = False
return nb
Principe. On utilise un drapeau dans_mot qui passe à True au début de chaque mot et à False quand on rencontre un espace. On incrémente nb uniquement quand on entre dans un nouveau mot.
Trace pour " AB CD " :
| Position | Caractère | dans_mot avant | Action | nb |
|---|---|---|---|---|
| 0 | ' ' | False | rien | 0 |
| 1 | ' ' | False | rien | 0 |
| 2 | 'A' | False | nb++, dans_mot = True | 1 |
| 3 | 'B' | True | rien | 1 |
| 4 | ' ' | True | dans_mot = False | 1 |
| 5 | ' ' | False | rien | 1 |
| 6 | 'C' | False | nb++, dans_mot = True | 2 |
| 7 | 'D' | True | rien | 2 |
Résultat final : 2. ✓
Au bac, quelle version écrire ?
- En épreuve pratique sur machine : la version 1 (
len(phrase.split())) est plus courte, plus lisible et acceptée par tous les correcteurs. Préférez-la quand vous êtes pressé. - En épreuve théorique où le sujet demande l'algorithme détaillé : la version 2 montre que vous comprenez la mécanique. Les correcteurs y voient une preuve de maîtrise au-delà du « truc » de la méthode native.
Connaître les deux vous met à l'abri d'un sujet qui interdirait l'usage de split().
Niveau Avancé — Hors bac (bonus)
Écrire une fonction est_identifiant_valide(ch) qui retourne True si la chaîne est un identifiant Python valide, False sinon. Règles :
- Au moins un caractère.
- Premier caractère : lettre (a-z, A-Z) ou underscore (
_). - Caractères suivants : lettres, chiffres, underscores.
- Ne doit pas être un mot-clé Python (35 mots-clés au total :
if,elif,else,for,while,def,return,lambda,True,False,None,and,or,not,in,is,class,import,from,as,pass,break,continue,with,try,except,finally,raise,global,nonlocal,del,yield,assert,async,await).
N'utiliser pas str.isidentifier() (méthode native triviale). Implémenter le test manuellement.
Voir le corrigé
import keyword
# Liste exhaustive (35 mots) fournie par Python lui-même via le module
# `keyword`. On évite ainsi d'oublier des mots-clés (lambda, yield, async…).
# Si on devait l'écrire à la main au bac, voici les principaux :
MOTS_RESERVES_PRINCIPAUX = {
"if", "elif", "else", "for", "while", "break", "continue",
"def", "return", "lambda", "class",
"True", "False", "None",
"and", "or", "not", "in", "is",
"import", "from", "as", "pass", "with", "try", "except",
}
def est_identifiant_valide(ch):
# Règle 1 : au moins un caractère
if len(ch) == 0:
return False
# Règle 2 : premier caractère lettre ou _
premier = ch[0]
if not (premier.isalpha() or premier == "_"):
return False
# Règle 3 : suivants alphanumériques ou _
for c in ch[1:]:
if not (c.isalnum() or c == "_"):
return False
# Règle 4 : pas un mot réservé Python
if keyword.iskeyword(ch):
return False
return True
# Tests
print(est_identifiant_valide("nom_complet")) # True
print(est_identifiant_valide("2eme")) # False (commence par chiffre)
print(est_identifiant_valide("nom-complet")) # False (tiret)
print(est_identifiant_valide("_total")) # True
print(est_identifiant_valide("if")) # False (mot réservé)
print(est_identifiant_valide("")) # False (vide)
print(est_identifiant_valide("a")) # True (un seul caractère)
Décomposition de l'algorithme :
- Test de longueur. Cas limite n°1 : chaîne vide.
- Premier caractère. On teste explicitement avec
isalpha()et==pour_. - Caractères suivants. Boucle sur
ch[1:](tout sauf le premier), testisalnum() or == "_". - Mot réservé. Test final via
keyword.iskeyword(ch)qui interroge la liste officielle Python — toujours à jour, jamais incomplète.
Pourquoi le module keyword ? Python définit officiellement 35 mots-clés (False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield). Les énumérer à la main expose à des oublis. keyword.iskeyword() interroge directement Python — robuste et future-proof.
Au bac : la fonction keyword.iskeyword() n'étant pas au programme, on accepte une liste à la main des mots-clés principaux (le set MOTS_RESERVES_PRINCIPAUX ci-dessus suffit). Le correcteur ne pénalise pas si vous oubliez nonlocal ou async.
Variante avec compréhension de liste (Python avancé) :
import keyword
def est_identifiant_valide(ch):
if not ch or keyword.iskeyword(ch):
return False
if not (ch[0].isalpha() or ch[0] == "_"):
return False
return all(c.isalnum() or c == "_" for c in ch[1:])
all(...) retourne True si tous les éléments satisfont la condition. C'est élégant mais hors programme officiel 4ème.
⚠️ Erreurs fréquentes au bac
Avant le quiz, mémorisez ces pièges classiques qui font perdre des points :
- Erreur 1. Essayer de modifier une chaîne en place :
ch[0] = 'B'en Python lèveTypeError(immutabilité). - Erreur 2. Comparer deux chaînes sans gérer la casse.
"Tunisie" == "tunisie"→False. Utiliser.lower()des deux côtés. - Erreur 3. En Python, un indice négatif (
ch[-1]) accède au dernier caractère. Source de surprise quand la chaîne est vide. - Erreur 4. Confondre
find(retourne l'indice, -1 si absent) etin(retourne True/False).
3. Quiz de vérification
Chaînes de caractères (5 questions)
Quelle est la longueur de la chaîne 'Bac 2026' ?
En Python, mot = 'abc' puis mot[0] = 'X' donne :
'abracadabra'.count('a') retourne :
Pour parcourir TOUS les caractères d'une chaîne ch en Python, la forme idiomatique est :
Pour vérifier si un caractère c est un chiffre, on utilise :
En résumé
Avec cette leçon, le chapitre 3 est terminé. Vous savez :
- ✅ Manipuler les chaînes par indice et par méthode (
upper,lower,find,split,replace), - ✅ Implémenter les traitements canoniques : longueur, parcours, recherche, comptage, inversion,
- ✅ Gérer l'immuabilité des chaînes Python en créant de nouvelles chaînes par concaténation,
- ✅ Combiner plusieurs opérations dans des algorithmes complexes (palindrome, validation, capitalisation).
Le chapitre 4 clôt le programme officiel par les algorithmes classiques de tri et de recherche, qui exploitent intensivement les tableaux et la modularité que vous venez d'acquérir.