chaine = "Lycée Salvador Allende"
chaine[0]

Par contre, il est impossible de modifier une chaîne de caractères ! On dit alors qu'il s'agit d'une liste non mutable :

chaine[1]= "a"

Si vous décidiez de lui ajouter des caractères en fin de chaîne à l'aide d'une concaténation du type suivant :

chaine = chaine+" - Hérouville saint clair"
chaine

Remarque : Contrairement aux apparences, la chaine n'a pas été modifiée puisque les chaines sont non mutables, une nouvelle chaine a été crée par concaténation des deux chaines placées autour du signe +

Il existe de nombreuses méthodes agissant sur les chaînes de caratères. Pour les voir, vous pouvez utiliser la fonction d'autocompletion de Jupyter en tapant dans une cellule de code

chaine. 

puis en pressant la touche TAB. N'oubliez pas le . !

Vous devriez voir la liste des méthodes disponibles :

. . . .
x.capitalize x.isalnum x.join x.rsplit
x.casefold x.isalpha x.ljust x.rstrip
x.center x.isdecimal x.lower x.split
x.count x.isdigit x.lstrip x.splitlines
x.encode x.isidentifier x.maketrans x.startswith
x.endswith x.islower x.partition x.strip
x.expandtabs x.isnumeric x.replace x.swapcase
x.find x.isprintable x.rfind x.title
x.format x.isspace x.rindex x.translate
x.format_map x.istitle x.rjust x.upper
x.index x.isupper x.rpartition x.zfill
chaine.

Inutile de toutes les connaître. Nous allons voir ici les fonctions les plus utiles.

Couper et joindre

La fonction split() permet de découper la chaîne de caractères qui lui est passée en paramètre suivant un ou des caractère(s) de séparation et renvoie une liste des chaînes découpées. Les caractères de séparation lui sont également passés en paramètre et, si ce n'est pas le cas, ce sera le caractère espace qui sera utilisé :

chaine="Lycée Salvador Allende - Hérouville saint clair"
chaine.split()
chaine.split('-')

L'opération inverse s'appelle join(). Elle consiste a rendre une liste de chaînes de caractères pour former une chaîne en concaténant tous les éléments et en les assemblant à l'aide d'un caractère.

Cette méthode prend en paramètre une liste de caractères et s'applique à une chaîne de caractères désignant le ou les caractère(s) de liaison :

liste = ['Lycée Salvador Allende', 'Hérouville saint clair']
' - '.join(liste)

Majuscule et minuscule

Deux autres méthodes standards peuvent être utiles:

lower() et upper() permettant respectivement de convertir les caractères d'une chaîne en minuscules ou en majuscules.
Attention, bien que parlant de conversion, ces méthodes ne modifient pas la chaîne de départ mais renvoient une nouvelle chaîne :

chaine.upper()
chaine.lower()

La fonction capitalize() permet de ne mettre en majuscule que la première lettre d'une chaîne :

chaine.capitalize()

rechercher un caractère, une position etc... dans une chaîne.

  • La fonction len() permet, comme pour les listes, de connaîntre la longueur de la chaîne, c'est à dire compter le nombre de caractères.
chaine = "Lycée Salvador Allende"
len(chaine)
  • La méthode count() permet de compter le nombre d'occurrences d'une sous chaîne dans une chaîne de caractères.
    Le premier paramètre est la chaîne dans laquelle effectuer la recherche et le second paramètre est la sous chaîne :
chaine.count('a')
  • La méthode find() permet de trouver l'indice de la première occurrence d'une sous chaîne. Les paramètres sont les mêmes que pour la fonction count()
    En cas d'échec, find() renvoie la valeur -1 ( 0 correspond à l'indice du premier caractère): On utilisera rfind() pour la dernière ocurrence.
chaine.find('a')
chaine.find('b')
chaine.rfind('a')
  • index() est identique à find() mais retourne une erreur en cas d'échec
chaine.index('a')
chaine.index('b')
  • La fonction replace() permet, comme son nom l'indique, de remplacer une sous chaîne par une autre à l'intérieur d'une chaîne de caractères.
    Les paramètres sont, dans l'ordre : la chaîne de caractères à modifier, la sous chaîne à remplacer, la sous chaîne de remplacement,et, éventuellement, le nombre maximum d'occurrences à remplacer (si non spécifié, toutes les occurrences seront remplacées).
chaine.replace('a','@')

et bien sûr, la variable chaine n'est pas modifiée, c'est une nouvelle chaine qui est renvoyée par cette méthode !

chaine

Conversion chaîne <-> nombres

Il ne faut pas confondre les objets 12 et "12". Le premier désigne un nombre, le second est une chaîne de caractère. Les comportements et les opérations sont différents.

12 == "12"
12+1
"12"+"1"

Il peut être néanmoins possible de convertir un nombre en chaîne et réciproquement comme on va le voir sur les exemples ci-dessous

int("12")
str(12)

Comparaison de chaînes de caractères

De même qu'il est possible de comparer deux nombres, on peut aussi comparer des chaines par rapport à l'ordre lexicographique :

"a"<"b"
"a"<="r"<="z"
"a"<="R"<="z"
"toto"<"titi"

Tranches de chaînes

Le tranchage (slicing) fonctionne exactement comme pour les listes. Observez les exemples suivants.

chaine = "Lycée Salvador Allende"
# obtenir la fin d'une chaîne
chaine[6:]
# obtenir le début d'une chaîne
chaine[:5]
# Un intervalle
chaine[6:14]

Et avec des index négatifs ...

chaine[-1]
chaine[:-1]
# ce dernier exemple est très pratique pour renverser un itérable
chaine[::-1]

Parcourir une chaîne de caractères

Une chaîne de raractère en Python rentre dans la catégorie des itérables au même titre que les listes. On retrouve donc les deux modes de parcours déjà rencontrés sur les listes, à savoir :

# Le parcours caractères par caractères :
chaine = "ISN"
for c in chaine:
    print(c)
# Le parcours par indice
chaine = "ISN"
for i in range(len(chaine)):
    print(chaine[i])

Mise en pratique

Exercice 1

Écrire une fonction nb_chiffres qui prend en paramètre une chaîne de caractère et qui renvoie le nombre de chiffres contenus dans la chaîne

def nb_chiffres(chaine):
    # YOUR CODE HERE
    raise NotImplementedError()
chaine = "Lycée Allende - 14200 Hérouville"
assert nb_chiffres(chaine)==5

Exercice 2

Écrire une fonction is_email qui prend en paramètre une chaîne de caractère et renvoie True si celle-ci est une adresse mail. On va simplifier en considérant qu'on a une adresse email si la chaîne possède les 2 propriétés suivantes :

  • Un seul caractère @
  • Un seul caractère .(point) après @.
def is_email(chaine):
    # YOUR CODE HERE
    raise NotImplementedError()
assert is_email("olivier.lecluse@monfai.com")
assert not is_email("olivier.lecluse_AT_monfai.com")
assert not is_email("olivier.lecluse@monfai")

Exercice 3

Un nombre est un palindrome s'il s'écrit de la même manière de gauche à droite ou de droite à gauche. Exemple : 12521.

Ecrire une fonction est_palindrome prenant en paramètre un nombre et renvoyant True ou False selon que c'est un palindrom ou non.

def est_palindrome(n):
    # YOUR CODE HERE
    raise NotImplementedError()
assert est_palindrome(12521)
assert not est_palindrome(12520)

Exercice 4

Ecrire une fonction somme_chiffres prenant un entier en paramètre et renvoyant la somme des chiffres de ce nombre.

somme_chiffres(125) renvoie 8 puisque 1+2+5=8

def somme_chiffres(n):
    # YOUR CODE HERE
    raise NotImplementedError()
assert somme_chiffres(125)==8