Bienvenue sur python.gecif.net | LE SITE POUR APPRENDRE A PROGRAMMER EN PYTHON | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Cette page est structurée en 2 parties : Tous les exemples suivants sont à tester dans la console d'EduPython afin de découvrir la manipulation des chaînes de caractères en Python.
Manipulation de base des chaînes de caractères
Une chaîne de caractères est une suite de caractères représentant un message et encadrée par le caractère "double quote" : >>> chaine="Ceci est une chaîne de caractères" La fonction print de Python permet d'afficher une chaîne de caractères : >>> print(chaine)
L'opérateur + permet de concaténer plusieurs chaînes de caractères, c'est-à-dire de les rassembler pour n'en former plus qu'une : >>> ch1="Python permet" Autre exemple de concaténation de deux chaînes de caractères avec l'opérateur + : >>> "Ceci "+"est une chaîne"+" de caractères" L'opérateur * permet de multiplier plusieurs fois une chaîne de caractères, c'est-à-dire de la répéter à l'identique : >>> "ABC" * 3 L'opérateur in permet de tester si une chaîne est comprise dans une autre chaîne. C'est un opérateur booléen qui renvoie soit Vrai (True) soit Faux (False) : >>> "n" in "Bonjour"
L'accès direct à un caractère se fait en l'indexant à partir de 0 en précisant un indice entre crochets : >>> s="Python" Un index négatif part de la fin de la chaîne (s[-1] étant le dernier caractère) : >>> s[-1] Il est possible de définir une "tranche" de la chaîne en utilisant le caractère deux points dans l'indice indiqué entre crochets. Exemples : Les caractères du début au 3 (non compris) : >>> s[:3] Les caractères du 3 (compris) à la fin de la chaîne : >>> s[3:] Les caractères 1 (compris) à 4 (non compris) : >>> s[1:4] Les caractères 0 (compris) à 5 (non compris) par pas de 2 (un sur 2) : >>> s[0:5:2]
Voici quelques méthodes ou fonctions pratiques appliquées sur une chaîne de caractères :
La fonction len permet de connaître le nombre de caractères d'une chaîne : >>> len("ABC")
La méthode count permet de savoir combien de fois un caractère (ou une sous-chaîne) est présent dans la chaîne : >>> s="Python permet de manipuler facilement les chaînes de caractères"
La méthode index permet de savoir à quelle position se trouve un caractère particulier ou une sous-chaîne : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : si la sous-chaîne recherchée n'existe pas dans la chaîne analysé, alors la méthode index renvoie une erreur : >>> s="Python permet de manipuler facilement les chaînes de caractères"
La méthode find permet de savoir à quelle position se trouve un caractère particulier ou une sous-chaîne : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : si la sous-chaîne recherchée n'existe pas dans la chaîne analysée, alors la méthode find renvoie la valeur -1 sans provoquer d'erreur. Pour cette raison la méthode find est préférable à la méthode index mais les deux sont à connaître.
La méthode replace permet de remplacer un caractère par un autre sur l'ensemble de la chaîne. Remplaçons par exemple tous les caractères "espace" par des caractères "underscore" : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : la chaîne renvoyée est bien la chaîne d'origine avec les caractères substitués, mais la chaîne s d'origine n'a pas été modifiée. Pour conserver la nouvelle chaîne après la transformation il faut l'enregistrer dans une nouvelle variable : >>> s1="Python permet de manipuler facilement les chaînes de caractères" La méthode replace permet de remplacer toute une sous-chaîne (et pas seulement un seul caractère à la fois) : >>> s1="Python permet de manipuler facilement les chaînes de caractères" Remarque : si la sous-chaîne recherchée n'existe pas, la méthode replace renverra la chaîne d'origine non transformée et sans provoquer d'erreur : >>> s1="Python permet de manipuler facilement les chaînes de caractères"
La méthode split permet de découper une chaîne selon un séparateur particulier et renvoie le résultat dans une liste. Par exemple si on découpe la chaîne selon le caractère "espace", on obtient la liste des mots : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : en Python une liste est une série d'éléménts écrits entre crochets et séparés par une virgule. Exemple : [1,2,3,4] est une liste On peut découper la chaîne selon n'importe quel caractère séparateur. Par exemple le caractère "a" : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : le caractère séparateur n'est plus présent dans la liste obtenue. On peut également découper la chaîne selon une sous-chaîne. Par exemple la sous-chaîne " de " : >>> s="Python permet de manipuler facilement les chaînes de caractères" Enfin, si on veut conserver la liste générée il faut l'enregistrer dans une variable : >>> s="Python permet de manipuler facilement les chaînes de caractères"
La méthode join permet de joindre les différents éléments d'une liste en utilisant une chaîne comme séparateur et renvoie le résultat dans une chaîne de caractères. Par exemple si on joint la liste ['A','B','C'] avec la chaîne '#' on obtient la chaîne 'A#B#C' : >>> '#'.join(['A','B','C']) Autre exemple : pour obtenir la chaîne 'il fait beau' à partir de la liste de mots ['il','fait','beau'] il faut utiliser un espace comme séparateur. La jointure s'écrit alors : >>> ' '.join(['il','fait','beau']) On vient de voir la jointure appliquée à une liste, mais la jointure peut aussi s'appliquer à une chaîne de caractères. Voici quelques exemples à tester : >>> '+'.join('123456')
La fonction sorted permet de trier une chaîne de caractères dans l'ordre croissant. Elle renvoie une liste dans laquelle les caractères sont rangés dans l'ordre croissant : >>> sorted("571643")
Voici 4 méthodes permettant de convertir des lettres majuscules en lettres minuscules ou inversement. La méthode upper permet de convertir en majuscules la totalité des lettres (accentuées ou pas) d'une chaîne de caractères, que les lettres soient en majuscules ou en minuscules dans la chaîne d'origine : >>> s="Python permet de manipuler facilement les chaînes de caractères" Remarque : les caractères non alphabétiques (chiffres, caractères de ponctuation, etc.) sont inchangés par la méthodes upper : >>> s="Dans l'addition 2+3=5, le caractère + est un opérateur et le résultat 5 est appelé 'la somme'." La méthode capitalize convertit en majuscule la première lettre d'une chaîne de caractères, et en minuscules la totalité des autres : >>> s="le langage de programmation Python permet de manipuler facilement les chaînes de caractères" Quelque soit la casse (minuscule ou majuscule) des lettres dans la chaîne d'origine, seule la première lettre est mise en majuscule par la méthode capitalize : >>> s="le soleil" Remarque : les caractères non alphabétiques (chiffres, caractères de ponctuation, etc.) sont inchangés par la méthodes capitalize : >>> s="dans l'addition 2+3=5, le caractère + est un opérateur et le résultat 5 est appelé 'la somme'." La méthode title permet de convertir en majuscule la première lettre de chaque mot d'une chaîne : >>> s="python permet de manipuler facilement les chaînes de caractères" En cas de mot composés (contenant un trait d'union), les initiales des 2 mots sont converties en majuscule par la méthode title : >>> s="on appelle sous-chaîne un ensemble consécutif de caractères compris dans une chaîne" Remarque : les caractères non alphabétiques (chiffres, caractères de ponctuation, etc.) sont inchangés par la méthodes title : >>> s="dans l'addition 2+3=5, le caractère + est un opérateur et le résultat 5 est appelé 'la somme'." La méthode swapcase permet d'inverser la casse (minuscule/majuscule) de tous les caractères alphabétiques d'une chaîne : >>> s="Python permet de manipuler facilement les chaînes de caractères" Toutes les lettres, y compris les lettres accentuées, ont leur casse modifiée par la méthodes swapcase : >>> s="la méthode SWAPCASE de Python bascule la CASSE (majuscule/minuscule) de toutes les LETTRES de la chaîne" Remarque : les caractères non alphabétiques (chiffres, caractères de ponctuation, etc.) sont inchangés par la méthodes swapcase : >>> s="Dans l'addition 2+3=5, le caractère + est un OPÉRATEUR et le résultat 5 est appelé 'la somme'."
D'autres méthodes avancées non vues ici sont applicables à un objet chaîne de caractères.
Conversion des chaînes de caractères La fonction str permet de convertir en chaîne de caractère un objet quelconque : >>> str(56) Par exemple si n est un nombre entier, str(n) renvoie une chaîne de caractères composée des chiffres de n : >>> n=2019 Attention : dans l'exemple précédent n est une variable de type nombre entier, et ch est une variable de type chaîne de caractères composée des caractères 2, 0, 1 et 9. La fonction str permet également de convertir en chaîne de caractères un nombre décimal. Exemples : >>> str(3.14) Remarque : la fonction str peut également s'appliquée sur une liste : >>> liste=["A","B","C"] La fonction list peut convertir en liste une chaîne de caractères : >>> list("Bonjour") On obtient alors une liste dont chaque élément est un caractère de la chaîne d'origine : >>> list("Il était une fois")
Les différents délimitateurs encadrant une chaîne de caractères Les chaînes de caractères peuvent être encadrées par 4 délimitateurs différents :
Exemples : >>> "Bonjour"
>>> "Ceci est une chaîne contenant des 'simples quotes' dans ces caractères"
>>> 'Ceci est une chaîne contenant des "doubles quotes" dans ces caractères'
>>> """Ceci est une chaîne Remarque : les retours à la ligne sont codés \n dans la chaîne de caractères.
>>> """Voici une chaîne contenant à la fois des 'simples' et des "doubles" quotes""" Remarque : les simples quotes sont codés \' dans la chaîne de caractères si la chaîne est encadrée par des simples quotes. Si on veut écrire à la fois des simples quotes et des doubles quotes dans une chaîne de caractères il faut l'encadrer par des 'triples simples quotes' ou des "triples doubles quotes" : >>> '''Voici une chaîne de caractères contenant à la fois des 'simples quotes' et des "doubles quotes"'''
Formatage d'une chaîne de caractères Appliqué à une chaîne de caractères, l'opérateur % permet de "formater" la chaîne, c'est-à-dire d'y insérer des valeurs à des endroits précis afin de former facilement un message complexe. Tous les motifs %s présents dans la chaîne sont remplacés par les valeurs passées à droite du symbole % : >>> "Voici un %s exemple" % ("premier") Il peut y avoir plusieurs valeurs à insérer dans la chaîne qui contient alors plusieurs motifs %s : >>> "%s permet de %s facilement les %s de caractères" % ("Python","formater","chaînes") Les valeurs de remplacement peuvent être des nombres (entiers ou décimaux) : >>> "Ces %s articles coûtent %s euros" % (3,8.25) Les valeurs de remplacement peuvent être des variables : >>> nom="Maxime" Pour forcer un nombre à s'afficher en nombre entier il faut utiliser le motif %d à la place de %s : >>> "%s -----> %d" % (7.256,7.256) Pour forcer un nombre à s'afficher en nombre décimal il faut utiliser le motif %f à la place de %s : >>> "%s -----> %f" % (81,81) L'avantage du motif %f est qu'on peut préciser le nombre de chiffres après la virgule que l'on veut afficher : >>> pi=3.14159265358979 On constate que par défaut le motif %f affiche 6 chiffres après la virgule. En résumé, dans une chaîne formatée par l'opérateur % :
A retenir : Il existe 4 opérateurs applicables sur des chaînes de caractères en Python, les voici :
Voici les fonctions Python applicables à une chaîne de caractères :
Il existe un grand nombre de méthodes applicables à un objet chaîne de caractères en Python. En voici quelques unes :
Pour obtenir l'ensemble des méthodes applicables à une chaîne de caractères on pourra taper dir("chaine") dans une console Python : toutes les méthodes utilisables sont alors renvoyées dans une liste.
L'encodage des caractères en Python En informatique les caractères sont enregistrés en mémoire sous forme d'un code numérique, appelé "code ASCII" pour les caractères les plus courant. Les fonctions chr() et ord() permettent de passer d'un caractère à son code ASCII : >>> ord('A') L'encodage consiste à remplacer un caractère (par exemple 'A') par son code numérique (par exemple 65) : c'est ce que fait la fonction ord()
Le décodage consiste à remplacer un code numérique (par exemple 65) par le caractère correspondant (par exemple 'A') : c'est ce que fait la fonction chr()
Dans les 2 cas il faut utiliser un jeu de caractères précis, sachant qu'il en existe 3 sortes :
La méthode encode() liée aux chaînes de caractères permet de retrouver l'encodage de la chaîne en utilisant un certain jeu de caractères : >>> 'abc'.encode('ascii') Pour Python 3 l'encodage par défaut est l'utf-8 : >>> 'à'.encode() On obtient alors une chaîne "binaire" contenant la valeur des octets la constituant, et préfixée par b. Un tel objet est de type bytes (et non str ou int) et sera appelé "une chaîne binaire" (par opposition à "une chaîne str") : >>> b=b'\xe9' Les objets de type bytes disposent d'une méthode decode() permettant de décoder la chaîne binaire, c'est-à-dire de passer de l'ensemble des valeurs numériques des octets aux caractères qui sont encodés. Là encore pour décoder une chaîne binaire (de type bytes) il faut préciser le jeu de caractères utilisé : >>> a En Python 3 la méthode de décodage utilisée par défaut est l'utf-8 : >>> e=b'\xe2\x82\xac' Remarque : le code \xe9 n'étant pas un code valide en UTF-8, Python renvoie alors une erreur : c'est un code en ISO8859 (ou latin) il faut alors le préciser à la méthode decode() sans quoi elle utilisera l'UTF-8. Pour convertir un entier n (de type int) en chaîne binaire (de type bytes) il faut utiliser la méthode .to_bytes() liée aux entiers. Elle attend 2 paramètres :
>>> n=181 Pour convertir une chaîne binaire (de type bytes) en chaîne de caractère classique (de type str) il faut utiliser la méthode decode() liée aux chaînes binaires : >>> ch_b Pour convertir une chaîne de caractères (de type str) en chaîne binaire (de type bytes) il faut utiliser la méthode encode() liée aux chaînes str : >>> ch_s='é' Par exemple pour afficher les caractères n°65 à n°74 de la table ASCII de base on tapera le programme suivant :
>>> for n in range(65,75):
Les différents jeux de caractères
La table ASCII de base contient 128 caractères (de code 0 à 127) avec seulement 95 caractères imprimables (de code 32 à 126). Voici la table ASCII complète (128 caractères dont les codes en décimal vont de 0 à 127) : Et voici seulement les 95 caractères imprimables de la table ASCII (code 32 à 126 en décimal) :
Par exemple dans cette table ASCII on voit que le caractère 'A' correspond au code 65 en décimal. Pour utiliser la table ASCII de base avec les méthode encode() et decode() de Python il faut indiquer le nom 'ascii' : >>> 'A'.encode('ascii') On remarque que dans une chaîne binaire (de type bytes) si les caractères appartiennent à la table ASCII de base il sont affichés tels quels dans la chaîne binaire (comme pour une chaîne str). En informatique les caractères spéciaux portent un nom précis, indépendant de la fonction qu'il peuvent remplir. Voici le nom exact de 16 caractères spéciaux présents dans la table ASCII :
En principe le terme "table ASCII" devrait être réservé à la table ASCII de base possédant seulement 128 caractères (il n'y en a qu'une). Les tables ASCII étendues à 256 caractères devraient être appelées des pages de code (il y en a plusieurs, selon le pays dans lequel elles sont utilisées). La table ASCII étendue ANSI porte différents noms :
>>> 'à'.encode('latin') La table ASCII étendue utilisée par le système d'exploitation Microsoft Windows est la page de code Windows-1252 (noté cp1252 dans Python, cp signifiant "Code Page", soit "page de code") et appelée "table ANSI". Les autres tables ASCII étendues : La table ASCII OEM correspond à la page de code n°437 (noté cp437 pour Python). Elle est utilisée par les systèmes IBM et Microsoft en Amérique : >>> 'à'.encode('cp437') La table ASCII étendue utilisée par le système d'exploitation MS-DOS de Microsoft en Europe occidentale est la page de code n°850 (noté cp850 dans Python) : >>> 'à'.encode('cp850') La table ASCII étendue utilisée par les systèmes d'exploitation Apple est la page de code MAC Roman (noté mac-roman dans Python) >>> 'à'.encode('mac-roman')
Pour afficher les tables ASCII étendue OEM et ANSI dans un document PDF cliquez ici. Pour afficher la table ASCII ANSI (page de code cp1252) dans une nouvelle page web cliquez ici.
L'unicode est le jeu de caractères universel, utilisé par tous et désormais pour toujours. Il contient plusieurs milliers de caractères, possédant chacun un numéro unique appelé "point de code". Pour utiliser le jeu de caractères Unicode et obtenir le point de code d'un caractère il faut préciser 'unicode_escape' en paramètre de la méthode encode() : >>> "€".encode('unicode_escape') Remarque : la fonction ord() de Python donne également le point de code d'un caractère unicode, mais en décimal. Si on veut le point de code en hexadécimal il faudra le convertir grâce à la fonction hex() : >>> ord('€') On en déduit que :
Et comme la fonction chr() de Python permet d'afficher un caractère à partir de son code numérique en décimal, il est possible d'obtenir le caractère Euro connaissant son point de code en décimal (appel direct de chr()) ou en hexadécimal (conversion grâce à int()) : >>> chr(8364) Pour savoir comment un caractère unicode est codé en UTF-8, il faut préciser l'algorithme d'encodage qui s'appelle UTF-8 (noté utf-8 dans Python) : >>> 'à'.encode('utf-8') UTF-8 est l'abréviation de l'anglais Universal character set Transformation Format - 8 bits. Les caractères unicode sont codés sur 1, 2, 3 ou 4 octets grâce à UTF-8 : les caractères les plus courant sont codés sur 1 octet (comme pour la table ASCII de base), et les caractères plus rares sont codés sur 2 à 4 octets. Par exemple on peut remarquer que le caractère 'à' est codé sur 2 octets en UTF-8. Remarque : si on ne précise pas le jeu de caractères pour l'encodage, Python 3 utilisera toujours UTF-8 comme encodage par défaut : >>> 'à'.encode() Enfin, pour décoder une séquence d'octets codée en UTF-8, il faut utiliser la méthode decode() liée aux chaînes binaires : >>> ch_b=b'\xc3\xa0' Remarque : si on ne précise pas l'algorithme de décodage à la méthode decode(), Python 3 utilisera toujours UTF-8 comme décodage par défaut.
Écriture d'une chaîne de caractères Pour écrire une chaîne de caractère (de type str) il suffit de taper les caractères entre des simples quotes : >>> ch='bonjour' C'est facile si les caractères son imprimés sur le clavier (exemple : les lettres de l'alphabet latin, mais ce ne sont que 26 caractères sur plus de 100 000 existants ...), mais c'est plus délicat pour les milliers de caractères du répertoire unicode qui ne sont pas sur le clavier. Exemple : comment utiliser le caractère 'fleur' alors qu'aucune fleur n'est dessinée sur les touches du clavier ? ? On peut justement aussi préciser dans la chaîne non pas les caractères directement, mais leur code numérique. Comme en Python 3 les chaînes sont en unicode, il s'agit alors des points de code dans la table unicode. Exemple : pour écrire un A dans une chaîne on peut saisir \x41 pour le caractère A a pour code ASCII 0x41 : >>> ch='\x41' Autre exemple : pour écrire le caractère copyright (de code 0xA9) au milieu d'une chaîne il faut insérer la séquence \xa9 dans la chaîne : >>> ch='Voici le caractère copyright : \xa9' Pour écrire un caractère unicode dont le point de code est sur 2 octets il faut insérer la séquence \uxxxx où xxxx est le point de code sur 4 chiffres en hexadécimal. Exemple : >>> ch='Voici un crayon : \u270f' Enfin, si on veut préciser le point de code d'un caractère unicode sur 4 octets il faut utiliser la séquence \Uxxxxxxxx (avec un U MAJUSCULE) : >>> '\x41' A retenir : Pour insérer un caractère unicode dans une chaîne de caractère en précisant son point de code en hexadécimal il faut le préfixer par :
Unicode et UTF-8
Unicode est un jeu de caractères universel et définitif : il contient tous les alphabets connus à ce jour et contient en plus des milliers de nouveaux symboles ou pictogrammes. Il contient plus de 100 000 caractères en tout aujourd'hui et évolue constamment. Dans la table unicode chaque caractère possède un code numérique unique appelé point de code Le point de code est un nombre entre 7 et 21 bits (2 millions de possibilités) et se note U+xxxx avec xxxx sa valeur en hexadécimal. Exemple : U+2740 seprésente "le caractère unicode qui a pour point de code 2740 en hexadécimal".
UTF-8 est l’algorithme permettant d’encoder un caractère de la table unicode en une séquence d'octets contenant 1 à 4 octets. UTF-8 permet de convertir un point de code (valeur entre 0 et 2 000 000) en une suite d’octets contenant 1 à 4 octets. Le décodage d'UTF-8 consiste à revenir au point de code à partir de la suite d’octets. Le nombre d'octets codant le caractère dans la séquence UTF-8 dépend du point de code :
Remarque importante concernant l'écriture des nombres pour la suite :
Encodage UTF-8 sur 1 octet :
>>> 'A'.encode()
Encodage UTF-8 sur 2 octets
>>> 'é'.encode()
>>> 'Ω'.encode()
Encodage UTF-8 sur 3 octets
>>> '€'.encode()
Encodage UTF-8 sur 4 octets
>>> '\U0001f334'.encode()
UTF-8 permet de convertir un point de code unicode en une séquence de 1 à 4 octets selon l'algorithme suivant :
Si UTF-8 n'existait pas, chaque caractère unicode devrait être codé sur 4 octets, et les simples fichiers texte prendraient alors 4 fois plus de place qu'avec un codage ASCII classique. Grâce à UTF-8 :
De plus, UTF-8 reste compatible avec ASCII : les 128 caractères de la table ASCII de base se codent de la même manière en UTF-8 et en ASCII (1 octet par caractère compris entre 0 et 127).
Pour aller plus loin Le module encodings permet d'encoder une chaîne de caractères en utilisant un certain jeu de caractères : import encodings La fonction encodings.aliases.aliases.values() donne l'ensemble des jeux de caractères utilisables (sous forme de dictionnaire). Pour obtenir une liste triée, claire et sans doublon on pourra taper par exemple la commande suivante dans la console Python : >>> sorted(set(encodings.aliases.aliases.values())) Le module codecs propose les fonctions encode() et decode() permettant d'encoder ou de décoder une chaîne de caractères : >>> import codecs Rappel : en Python 3 l'encodage par défaut est l'UTF-8. La fonction unicode_escape_encode() du module codecs permet de passer directement d'un caractère à son point de code unicode. Exemple : quel est le point de code du caractère Euro ? >>> codecs.unicode_escape_encode('€') Réponse obtenue grâce à la fonction codecs.unicode_escape_encode() : le point de code du caractère € est U+20AC
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|