[[python:bases:listes|{{ :suivant.png?nolink&30|Listes}}]] [[:python:bases:sequences|{{ :retour.png?nolink&30|Généralités}}]] [[:python:accueilpython|{{ :iconemaison.jpg?nolink&30|Sommaire Python et microPython}}]] ===== Python - Chaînes de caractères ===== [Mise à jour le : 18/8/2024] * **Sources** * **Documentation** sur Python.org : référence du langage, opérations usuelles sur les chaînes, fonctions natives (built-in) * ** Mots-clés** : collection, séquence, indexation, insertion, concaténation, formatage, accès, parcours, sélection. Les mots ci-dessous sont dits "réservés". Ils ne peuvent pas être utilisés comme nom de variable. Les mots __soulignés__ sont une nouveauté de Python 3. Les mots en **gras** sont utilisés dans cette page. | and | continue | finally | is | raise | | as | def | **for** | lambda | return | | assert | del | from | __None__ | __True__ | | __async__ | elif | global | __nonlocal__ | try | | __await__ | else | if | not | **while** | | break | except | import | or | with | | class | __False__ | **in** | pass | yield | * Fonctions natives** (built-in)**((Fonctions toujours disponibles.)) utilisées dans les exemples : **print**(), **len**(), **ord**(), **chr**(). ---- ==== 1. Introduction ==== En programmation, le texte s'appelle chaîne de caractères. Une chaîne de caractères est une **__séquence__**, ce qui signifie que c'est une **collection ordonnée** de valeurs. Le premier élément de la chaîne est **indexé** par **0**. Les chaînes de caractères sont des instances de la classe **str**. En Python une chaîne de caractères est **immuable** (ou **non mutable**) c'est-à-dire q'elle ne peut être modifiée après sa création. \\ Toutes les **méthodes** de manipulation des chaînes **renvoient** une **chaîne de caractères**. \\ \\ Il faut encadrer le texte de **guillemets** simples **' '** ou doubles **" "**. //Exemple// {{ :python:bases:pointeur.png?nolink|}} # Deux variables pointent vers le même objet chaîne de caractères s1 = 'abc' s2 = s1 {{ :python:bases:pointeur2.png?nolink|}} # Si on essaie de modifier l'objet (+ : concaténation) s1 = s1 + 'def' # alors une deuxième chaîne est créée pour s1, # et s2 continue à pointer vers s1 initial La liste des méthodes peut être obtenue dans l'interpréteur python avec **dir(str)** et une aide sur une méthode avec **help(str**.//méthode//**)**. //Exemple// {{ :python:poo:composites:help.png?nolink&500 |}} ==== 2. Mise en forme du texte ==== Les caractères d'une chaîne sont mis en forme avec les méthodes de la classe str. Par exemple en minuscules avec la méthode **lower**, en majuscules avec la méthode **upper**, etc. //Exemple// texte = "Le manuel de Python" # Conversion en majuscules print(texte.upper()) # Résultat : LE MANUEL DE PYTHON # Conversion en minuscules print(texte.lower()) # Résultat : le manuel de python Par défaut l'instruction **print** provoque un retour à la ligne après l'affichage. On peut changer ce comportement en fournissant une autre chaîne de caractère à accoler à l'affichage comme ci-dessous ou même rien. // Exemple // print("Ce texte s'affiche", end=" ") # Renvoie : Ce texte s'affiche sur une seule ligne. print("sur une seule ligne.", end=" ") ==== 3. Formatage ==== * **Depuis Python 3.6** * Source : Bibliothèques Python L'utilisation de **f-strings** permet d’insérer des expressions dans des chaines de caractères en utilisant une syntaxe minimale. //Exemple// monscore = 1000 f"Vous avez obtenu {monscore} points" # Résultat : Vous avez obtenu 1000 points Pour **associer** des chaînes (**concaténation**) on utilise l'opérateur **+**. //Exemple// texte1 = "Hello" texte2 = " World" texte3 = texte1 + texte2 # Résultat texte3 = "Hello World" * Pour **répéter** des chaînes, on utilise l'opérateur ** * **. //Exemple// texte2 = " World" texte3 = texte2*3 # Résultat texte3 = " World World World" * **Avant python 3.6** Pour **insérer des valeurs** dans une chaîne on utilise **%s** à l'emplacement retenu, la méthode **format** ou des **virgules**. //Exemples// score = 1000 # Utilisation de %s (à éviter, car lourd par rapport aux autres méthodes) points = "Vous avez obtenu %s points" print(points % score) # Résultat : Vous avez obtenu 1000 points # Utilisation de la méthode format() # Solution 1 print("Vous avez obtenu {0} points".format(score)) # Résultat : Vous avez obtenu 1000 points # Solution 2 print("Vous avez obtenu {score} points".format(score=monscore)) # Résultat : Vous avez obtenu 1000 points # Utilisation de virgules print("Vous avez obtenu",monscore,"points") # Résultat : Vous avez obtenu 1000 points ==== 4. Longueur d'une chaîne, parcours et sélection (slice) ==== * **Ressource** * Python Indexing and Slicing: Complete Tutorial With Hands-On Exercises * **Longueur d'une chaîne** La longueur d'une chaîne (son **nombre d'éléments**) est déterminée avec la fonction built-in **len**(). Exemple : **len**("Le jour le plus long") # renvoie 20 * **Accès** aux caractères d'une chaîne Pour accéder à un caractère dans une chaîne, on précise son indice entre crochets **[**//indice//**]**. \\ **L'indice du premier caractère est 0**. //Exemple// texte = "Le manuel de Python 3" texte[0] # Résultat : L texte[13] # Résultat : P * **Parcours** des éléments d'une chaîne //Exemple// texte = "Le manuel de Python 3" # Parcours avec une boucle while i=0 while i * **Sélection** de chaîne (slice) La sélection consiste à extraire une partie de la chaîne (//slicing//). Pour sélectionner une partie d'une chaîne, on précise la valeur du premier et du dernier indice entre crochet et éventuellement un pas. //Chaine//**[**//début// **:** //fin// **:** //pas//**]**. Par défaut //pas// = 1. {{ :python:poo:composites:brackets.png?nolink&300 |}} L'élément du **dernier indice** est **exclu**. // Exemple// texte = "Le manuel de Python 3" texte[:9] # Résultat : 'Le manuel' (borne début omise) texte[3:12] # Résultat : 'manuel de' texte[13:len(texte)] # Résultat : 'Python' # ou texte[13:] # Résultat : 'Python' (borne fin omise) texte[:] # Résultat : 'Le manuel de Python 3' (shadow copy) # Utilisation du pas texte[:9:2] # Résultat : 'L aul' texte[9::2] # Résultat : ' ePto ' # Indices négatifs texte[3:-2] # Résultat : 'manuel de Python' texte[-21:-14] # Résultat : 'Le manu' texte[::-1] # Résultat : '3 nohtyP ed leunam eL' (inverse le texte) ==== 5. Encodage, décodage ==== * **Ressource** : Guide Unicode "//Le type de chaîne de caractères de Python utilise le standard Unicode pour représenter les caractères, ce qui permet aux programmes Python de travailler avec tous ces différents caractères possibles. UTF-8 est l’un des encodages les plus couramment utilisés et Python l’utilise souvent par défaut. //" {{ :python:poo:composites:encode-decode.png?nolink |}} * **Caractère -> Unicode** La fonction **ord**(//car//) envoie le nombre entier représentant le code Unicode du caractère représenté par la chaîne //car//donnée. //Exemple// ord('a') # donne 97 hex(ord('a')) # donne 0x61 * **Code Unicode -> caractère** La fonction **chr**(//i//) renvoie la chaîne représentant un caractère dont le code de caractère Unicode est le nombre entier //i//. //Exemple// chr(ox26) # donne '&' ==== 6. Quelques méthodes de la classe str ==== ^**Mise en forme**^^ |**format**(arguments)|Place la liste des arguments, dans l'ordre, aux emplacements réservés par {0} dans la chaîne.nom = "Célestin" age = 4 print("{} a {} ans".format(nom,age)) # Célestin à 4 ans | ^ **Découpage** - **assemblage** ^^ |**split**() |Transforme une chaîne en une liste de sous-chaînes. Le **séparateur par défaut** est un **espace**, mais il est possible de lui donner en argument n’importe quel autre séparateur. s="Le petit chat de la voisine boit du lait" s.split() # Renvoie : ['Le', 'petit', 'chat', 'de', 'la', 'voisine', 'boit', 'du', 'lait']| |**join**(**liste**) |Effectue l’opération **inverse** de split. Commence par des **guillements** dans lesquels on place le **caractère de séparation**.l=['Le', 'petit', 'chat', 'de', 'la', 'voisine', 'boit', 'du', 'lait'] " ".join(l) # Renvoie : 'Le petit chat de la voisine boit du lait'| ^**Remplacement**^^ |**replace**(**old,new**) |Remplace le ou les caractères //old// par le ou les caractères //new//.s = "Le petit chat de la voisine boit du lait" s.replace("chat","chien") # Renvoie : 'Le petit chien de la voisine boit du lait'| ^**Nettoyage**^^ |**strip**() |Supprime les espaces, tabulations et retours à la ligne éventuels en début et en fin de chaîne." \tune chaîne avec des trucs qui dépassent \n".strip() # Renvoie : 'une chaîne avec des trucs qui dépassent'| |**lstrip**() |Enlève les espaces éventuels seulement en début de chaîne. | |**rstrip**() |Enlève les espaces éventuels en fin de chaîne. | ^**Recherche d'une sous-chaîne**^^ |**find**(**x**) |Fait exactement la même chose que index() sauf que si elle ne trouve pas la sous-chaîne, elle renvoie -1.# L'exemple ci-dessous renvoie l'indice du début de la première occurrence "abcdefcdefghefghijk".find("def") # soit ici 3 # rfind fait la même chose que find mais en partant de la fin "abcdefcdefghefghijk".rfind("fgh") # Renvoie 13 | |**index**(**y**) |Renvoie l’indice de la première occurrence de la chaîne passée en argument. Lève une exception en cas d'absence. | |**count**() |Renvoie le nombre d'occurrences d'une sous-chaîne."abcdefcdefghefghijk".count("ef") # renvoie 3 | |**startswith**() |Renvoie True si la chaîne commence par la sous-chaîne passée en argument. Sinon, elle renvoie False. "abcdefcdefghefghijk".startswith("abcd") # Renvoie True | |**endswith**() |Renvoie True si la chaîne se termine par la sous-chaîne passée en argument. Sinon, elle renvoie False. "abcdefcdefghefghijk".endswith("ghijk") # Renvoie True| ^**Changement de casse**^^ |**upper**() |Convertit la chaîne de caractères en majuscules. "monty PYTHON".upper() # Renvoie : 'MONTY PYTHON' | |**lower**() |Convertit la chaîne de caractères en minuscules. "monty PYTHON".lower() # Renvoie : 'monty python' | |**capitalize**() |Convertit la première lettre d'un mot en majuscule. "monty PYTHON".capitalize() # Renvoie : 'Monty python' | ^**Ajout de caractères**^^ |**zfill**(**n**) |Complète la chaîne par des zéros (à gauche) jusqu'à ce qu'elle contienne le nombre **n** de caractères passés en paramètres. bin(0)[2:].zfill(8) # Renvoie '00000000' | ---- ==== Résumé ==== * Les chaînes sont des **objets**. * Un objet est une **instance** de **classe**. * Une classe possède des **méthodes**, accessibles à partir de l'objet grâce à **objet.methode(arguments)**. * On peut accéder à un caractère dans la chaîne grâce à //chaine[indice]// ou à une partie de la chaîne grâce à //chaine[premier_indice:dernier_indice]// ---- {{ :python:bases:realpython.png?nolink|}} ==== Quiz ==== * Basic Data Types in Python * Splitting, Concatenating, and Joining Strings in Python Quiz ---- {{ :python:bases:realpython.png?nolink|}} ==== Pour aller plus loin ==== * A Guide to the Newer Python String Format Techniques * A Comprehensive Guide to Slicing in Python * Basic Data Types in Python * Custom Python Strings: Inheriting From str vs UserString * How to Convert a Python String to int * How to Use sorted() and sort() in Python * How to Replace a String in Python * How to Check if a Python String Contains a Substring * Python String Formatting Best Practices * Splitting, Concatenating, and Joining Strings in Python * Regular Expressions: Regexes in Python (Part 1) (Part 2) * Les expressions régulières dans la documentation Python - Outil pythex * Strings and Character Data in Python