Aller au contenu

Chaînes de caractères#

essentiel

Immutabilité#

Une chaîne ne peut pas être modifiée en place : toute méthode qui "modifie" renvoie une nouvelle chaîne.

s = "bonjour"
s.upper()     # "BONJOUR" — s reste inchangé
s = s.upper()  # il faut réassigner

Indexation et slicing#

s = "python"
s[0]        # 'p'
s[-1]       # 'n'
s[1:4]      # 'yth'
s[::-1]     # 'nohtyp' (inversée)
s[::2]      # 'pto'

Méthodes courantes#

s.upper(); s.lower(); s.title(); s.capitalize()
s.strip(); s.lstrip(); s.rstrip()          # espaces (ou caractères donnés)
s.replace("o", "0")
s.split(",")                                 # -> liste
",".join(["a", "b", "c"])                     # -> "a,b,c"
s.find("th")                                   # index ou -1
s.index("th")                                   # index ou ValueError
s.startswith("py"); s.endswith("on")
s.count("o")
s.isdigit(); s.isalpha(); s.isalnum(); s.isspace()
len(s)

Détail complet : Fonctions — Texte.

Concaténation et répétition#

"a" + "b"      # "ab"
"ab" * 3       # "ababab"
" ".join(["a", "b", "c"])   # préférer join() à + dans une boucle

Formatage#

f"{nom} a {age} ans"                 # f-string (à privilégier)
"{} a {} ans".format(nom, age)         # .format()
"%s a %d ans" % (nom, age)              # %-formatting (ancien style)

Mini-langage de format (identique en f-string et .format()) :

f"{3.14159:.2f}"      # '3.14'    — 2 décimales
f"{42:05d}"            # '00042'   — remplissage par des zéros
f"{1234567:_}"          # '1_234_567' — séparateur de milliers
f"{0.256:.1%}"           # '25.6%'  — pourcentage
f"{2.5e-8:.2e}"           # '2.50e-08' — notation scientifique
f"{'ok':>10}"              # '        ok' — aligné à droite sur 10 caractères
f"{nom!r}"                  # applique repr() au lieu de str()

Recherche par motif (re)#

Les expressions régulières forment un sous-langage à part entière ; ne les sortir que lorsque split, startswith ou in ne suffisent plus.

import re

m = re.search(r"(\d+)-(\d+)", "plage 10-25")   # 1re occurrence, ou None
if m:
    m.group(0)     # '10-25' (motif entier)
    m.group(1)      # '10'   (1er groupe capturant)
    m.groups()       # ('10', '25')

re.findall(r"\d+", s)          # toutes les occurrences, sous forme de liste
re.sub(r"\s+", " ", s)          # remplace toute suite d'espaces par un seul
re.split(r"[;,]\s*", s)          # découpe sur ';' ou ',' suivis d'espaces
re.fullmatch(r"\d{5}", s)         # le motif doit couvrir TOUTE la chaîne
Motif Signification
\d \w \s chiffre / caractère de mot / espace (majuscule = négation : \D)
. n'importe quel caractère sauf saut de ligne
* + ? 0-n / 1-n / 0-1 répétitions
{n,m} entre n et m répétitions
^ $ début / fin de chaîne
[abc] un caractère parmi a, b, c
(...) groupe capturant

Piège

Toujours écrire les motifs en raw string r"\d+" : sans le r, "\d" est interprété par Python avant re. re.match() n'ancre qu'au début de la chaîne : utiliser re.search() pour chercher partout, re.fullmatch() pour valider un format complet.