Prépa Python

Basique — chapitre 11 sur 54

Les chaînes de caractères

Création, indexation, slicing et méthodes essentielles

80 min11 évaluations

Les chaînes de caractères (str) sont omniprésentes en programmation : noms, messages, données lues depuis un fichier, réponses utilisateur… Ce chapitre est l'un des plus importants du niveau Basique car le TOSA évalue énormément les méthodes de chaînes.

Création d'une chaîne

Les chaînes se créent avec des guillemets simples '...', doubles "..." ou triples """...""" pour plusieurs lignes.

python
nom = "Alice"
ville = 'Paris'
texte_long = """Ceci est une chaîne
sur plusieurs
lignes."""

print(nom)
print(ville)
print(texte_long)

Guillemets dans une chaîne

Pour inclure le caractère du délimiteur, on alterne les types :

python
phrase1 = "Il a dit \"bonjour\""          # échappement avec \
phrase2 = 'Il a dit "bonjour"'            # alternance plus lisible
phrase3 = "L'ami de Bob"                   # apostrophe dans guillemets doubles

print(phrase1)
print(phrase2)
print(phrase3)

Caractères spéciaux

Séquence Signification
\n Saut de ligne
\t Tabulation
\\ Backslash \
\" Guillemet double dans une chaîne "..."
\' Apostrophe dans une chaîne '...'
python
print("Ligne 1\nLigne 2")
print("Colonne1\tColonne2")
print("Chemin : C:\\Users\\Alice")

Concaténation et répétition

On assemble des chaînes avec +, on répète avec * :

python
salutation = "Bonjour "
nom = "Alice"
message = salutation + nom + " !"
print(message)
python
ligne = "-" * 30
print(ligne)
print("Titre")
print(ligne)

Indexation

Chaque caractère d'une chaîne a un indice, à partir de 0.

text
Chaîne  :  P  y  t  h  o  n
Indice+ :  0  1  2  3  4  5
Indice- : -6 -5 -4 -3 -2 -1

Les indices négatifs partent de la fin : -1 est le dernier caractère.

python
mot = "Python"
print(mot[0])       # 'P'
print(mot[3])       # 'h'
print(mot[-1])      # 'n' (dernier)
print(mot[-2])      # 'o' (avant-dernier)

Le slicing (découpage)

La syntaxe chaine[debut:fin:pas] extrait une sous-chaîne.

  • debut : indice de départ (inclus) — par défaut 0.
  • fin : indice d'arrivée (exclu) — par défaut fin de chaîne.
  • pas : pas entre les caractères — par défaut 1.
python
mot = "Python"
print(mot[0:3])       # 'Pyt' (caractères 0, 1, 2 — 3 est EXCLU)
print(mot[2:5])       # 'tho'
print(mot[:3])        # 'Pyt' (depuis le début)
print(mot[3:])        # 'hon' (jusqu'à la fin)
print(mot[:])         # 'Python' (copie complète)

Le pas (step)

Le troisième paramètre permet de sauter des caractères.

python
alphabet = "abcdefghij"
print(alphabet[::2])    # un caractère sur deux : 'acegi'
print(alphabet[1::2])   # un sur deux, en commençant au 2ème : 'bdfhj'
print(alphabet[::-1])   # inverser ! 'jihgfedcba'

Slicing tolérant

À la différence de l'indexation, le slicing ne lève pas d'erreur si les indices sont hors limites :

python
mot = "Python"
print(mot[0:100])     # pas d'erreur : renvoie 'Python'
print(mot[50:60])     # pas d'erreur : renvoie '' (chaîne vide)

Les chaînes sont immuables

Une chaîne ne peut pas être modifiée après sa création. On dit qu'elle est immuable (immutable).

python
mot = "Python"
mot[0] = "J"        # ❌ Impossible !

Pour « modifier » une chaîne, on en crée une nouvelle :

python
mot = "Python"
nouveau = "J" + mot[1:]
print(nouveau)

Longueur et appartenance

len() donne la longueur (nombre de caractères). in teste la présence d'une sous-chaîne.

python
mot = "anticonstitutionnellement"
print("Longueur :", len(mot))

print("on" in mot)           # True
print("zzz" in mot)          # False
print("on" not in mot)       # False

Les méthodes de chaînes (à connaître par cœur pour le TOSA)

Python offre une cinquantaine de méthodes sur les chaînes. Voici les plus importantes, toutes testées au TOSA.

Casse (majuscules / minuscules)

Méthode Effet Exemple
upper() Tout en majuscules "abc".upper() → "ABC"
lower() Tout en minuscules "ABC".lower() → "abc"
title() Première lettre de chaque mot en majuscule "bonjour alice".title() → "Bonjour Alice"
capitalize() Première lettre en majuscule, reste en minuscules "BONJOUR".capitalize() → "Bonjour"
swapcase() Inverse casse "aBc".swapcase() → "AbC"
python
texte = "bonjour TOSA"
print(texte.upper())
print(texte.lower())
print(texte.title())
print(texte.capitalize())
print(texte.swapcase())

Recherche

Méthode Effet
find(sub) Indice de la première occurrence ou -1 si non trouvée
index(sub) Idem, mais lève ValueError si non trouvée
count(sub) Nombre d'occurrences
startswith(sub) Commence par sub ?
endswith(sub) Finit par sub ?
python
phrase = "Python est un langage puissant. Python est populaire."
print("Position de 'Python' :", phrase.find("Python"))
print("Position de 'Java' :", phrase.find("Java"))      # -1
print("Occurrences de 'Python' :", phrase.count("Python"))
print("Commence par 'Python' :", phrase.startswith("Python"))
print("Finit par '!' :", phrase.endswith("!"))

Nettoyage

Méthode Effet
strip() Retire espaces et tabulations aux deux extrémités
lstrip() Idem, uniquement à gauche
rstrip() Idem, uniquement à droite
strip(chars) Retire les caractères listés dans chars
python
texte = "   Bonjour TOSA   \n"
print(repr(texte.strip()))
print(repr(texte.lstrip()))
print(repr(texte.rstrip()))

# Avec des caractères spécifiques
print("###titre###".strip("#"))     # 'titre'

(repr() affiche la chaîne avec ses caractères spéciaux visibles.)

Remplacement et séparation

Méthode Effet
replace(old, new) Remplace toutes les occurrences
replace(old, new, n) Remplace les n premières occurrences
split(sep) Découpe en liste selon sep
split() sans arg Découpe selon tout espace blanc
sep.join(liste) Recolle une liste avec sep entre chaque
python
phrase = "Le chat de Paul aime le chat du voisin."
print(phrase.replace("chat", "chien"))
print(phrase.replace("chat", "chien", 1))   # une seule fois
python
phrase = "Python est un langage"
mots = phrase.split()
print(mots)
python
csv = "Alice,Bob,Charlie,Diana"
noms = csv.split(",")
print(noms)

# Recoller avec un autre séparateur
print(" | ".join(noms))

Tests sur le contenu

Ces méthodes renvoient un booléen selon la nature des caractères.

Méthode Vraie si la chaîne contient...
isdigit() uniquement des chiffres
isalpha() uniquement des lettres
isalnum() uniquement des lettres ou chiffres
isspace() uniquement des espaces blancs
isupper() toutes les lettres en majuscules
islower() toutes les lettres en minuscules
python
print("123".isdigit())          # True
print("12.5".isdigit())         # False (le point n'est pas un chiffre)
print("abc".isalpha())          # True
print("abc123".isalnum())       # True
print("   ".isspace())          # True
print("PYTHON".isupper())       # True

Enchaîner les méthodes

Puisque chaque méthode renvoie une chaîne, on peut les enchaîner directement :

python
texte = "   Bonjour TOSA   \n"
propre = texte.strip().lower().replace("tosa", "python")
print(propre)

C'est idiomatique en Python et très efficace.

Les entrées / sorties de base

print() — afficher

On l'a déjà rencontré, mais rappel des options utiles :

python
# Séparateur entre arguments (défaut : espace)
print("a", "b", "c", sep="-")

# Fin de ligne (défaut : \n)
print("Sans retour à la ligne", end=" ")
print("on continue ici.")

# Combiner
print("-" * 5, "Titre", "-" * 5)

Les f-strings (formatted strings) — glisser des valeurs dans un texte

Une f-string est une chaîne précédée de la lettre f. Tout ce qui est écrit entre accolades y est remplacé par sa valeur :

python
prenom = "Alice"
age = 30
print(f"{prenom} a {age} ans.")
print(f"Dans 5 ans, {prenom} aura {age + 5} ans.")

Plus besoin de str() ni de + : la conversion est automatique, et l'on peut mettre une expression entre les accolades. C'est la façon la plus lisible de composer un message, et celle qu'on emploiera dans la suite du cours. Les options de mise en forme — nombre de décimales, alignement en colonnes — font l'objet d'un chapitre de la Partie 2.

input() — lire

input() attend une saisie de l'utilisateur et renvoie toujours une chaîne.

python
nom = input("Votre nom ? ")
age_txt = input("Votre âge ? ")
age = int(age_txt)               # conversion nécessaire pour calculer

print("Bonjour", nom, "vous aurez", age + 1, "ans l'an prochain.")

Le mot-clé pass

pass est une instruction vide — elle ne fait rien. On l'utilise là où Python exige une instruction mais qu'on n'a encore rien à y mettre.

python
def ma_fonction():
    pass   # placeholder, à compléter plus tard

if condition:
    pass   # on ne fait rien dans ce cas
else:
    traiter()

Sans pass, on aurait une IndentationError : Python refuse un bloc vide.


Exercices

quiz 01.03.q1réponse unique
Que vaut "Python"[1:4] ?
quiz 01.03.q2réponse unique
Que vaut "Python"[-1] ?
quiz 01.03.q3réponse unique
Que renvoie "abc" * 3 ?
quiz 01.03.q4réponse unique
Quel code renverse la chaîne "Python" pour donner "nohtyP" ?
quiz 01.03.q5réponse unique
Que s'affiche-t-il ?
mot = "Python"
mot.upper()
print(mot)
quiz 01.03.q6réponse unique
Que renvoie "a,b,c,d".split(",") ?
quiz 01.03.q7réponse unique
Que renvoie " Python ".strip() ?
quiz 01.03.q8réponse unique
Quelle affirmation est VRAIE à propos des chaînes Python ?

exercice 01.03.x1à faire

Soit la chaîne phrase = " Bonjour le monde ! ".

Calculez, en rangeant chaque résultat dans la variable indiquée :

  1. longueur : la longueur de la chaîne (espaces compris).
  2. nettoyee : la chaîne sans les espaces de début et de fin.
  3. majuscules : la chaîne d'origine phrase (espaces compris) entièrement en majuscules.
  4. remplacee : la chaîne d'origine phrase (espaces compris) où « monde » est remplacé par « TOSA ».
  5. present : True si « bonjour » figure dans la chaîne, sans tenir compte des majuscules.

Affichez ces résultats comme vous le souhaitez.


exercice 01.03.x2à faire

À partir des variables prenom et nom, calculez les initiales en majuscules séparées par un point.

Exemple : Alice Dupont → A.D.


exercice 01.03.x3à faire

Un palindrome est un mot qui se lit de la même manière dans les deux sens (ex : radar, kayak, sos).

Calculez le booléen est_palindrome : True si la chaîne mot est un palindrome, sans tenir compte des majuscules.


À retenir