Ateliers Python : Les chaînes de caractères.
Transcription
Ateliers Python : Les chaînes de caractères.
Ateliers Python : Les chaînes de caractères. par X. HINAULT www.mon-club-elec.fr Tous droits réservés – 2013 - 2016. Document gratuit. Ce support PDF d'atelier Python + Qt vous est offert. Pour acheter d'autres supports d'ateliers Python rendez-vous ici : http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.PythonShell Vous avez constaté une erreur ? une coquille ? N'hésitez pas à nous le signaler à cette adresse : [email protected] Truc d'utilisation : visualiser ce document en mode diaporama dans le visionneur PDF. Navigation avec les flèches HAUT / BAS ou la souris. En mode fenêtre, activer le panneau latéral vous facilitera la navigation dans le document. Bonne lecture ! Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 1 / 17 Python : Les chaînes de caractères Par X. HINAULT – Mai 2013 – 2016 – www.mon-club-elec.fr – Tous droits réservés Ce que l'on va faire ici • Dans ce tutoriel, apprenez à utiliser les chaînes de caractères en langage Python qui offre une nouvelle fois de nombreuses possibilités très intéressantes. Pré-requis : un système graphique opérationnel • Je suppose ici que vous disposez ◦ d'un système graphique opérationnel (Gnu/Linux, Windows, Mac OsX) : ◦ avec Python installé ainsi que l'interpréteur Python de votre choix Lancer l'interpréteur Python • Commencer par la lancer l'interpréteur Python que vous souhaitez utiliser, soit en ligne de commande depuis une console, soit à partir du menu graphique du système. • Par exemple, pour lancer ipython, on fera : $ ipython qtconsole • ce qui donne : Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 2 / 17 • De façon comparable, on lancera dreampie en faisant : $ dreampie • On obtient : Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 3 / 17 • A noter avec Dreampie la particularité qui consiste à saisir les instructions Python dans la fenêtre du bas. Conseil d'ami : paramétrer la fenêtre de votre interpréteur en mode « toujours au dessus » (clic droit sur la barre de titre sous Gnu/Linux) pour pouvoir facilement travailler avec ce tuto. Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 4 / 17 Déclarer une chaîne de caractère La déclaration d'une chaîne de caractère se fait très simplement : >>> maChaine="coucou" >>> print maChaine coucou Difficile de faire plus simple. Et remarquer qu'il n'a pas été nécessaire de préciser le type de notre variable. En langage Python, les chaînes de caractères sont stockées dans le type 'str'. La variable déclarée ici a été automatiquement typée, comme vous pouvez le vérifier en posant : >>> type(maChaine) <type 'str'> Il est également possible de déclarer une chaîne multiligne en l'encadrant avec des triples " " ", ce qui donne : >>> monTexte="""blablabla ... bliblibli ... bloblo ... bloubloublou ... """ >>> print monTexte blablabla bliblibli bloblo bloubloublou Cette possibilité de définir une chaîne de caractère multiligne est très très intéressante notamment pour intégrer par simple copier/coller des extraits de code HTML ou autre « tel que » dans un script. Retenez çà... !! Le type str dispose de nombreuses fonctions et nous allons ici présenter quelques-unes intéressantes en pratique : http://docs.python.org/2/library/stdtypes.html#string-methods Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 5 / 17 Associer des chaînes entre elles Il est assez simple d'associer des chaînes entre-elles de façon à former une seule chaîne finale : on utilisera simplement le signe + entre les 2 chaînes, ce qui donne : >>> maChaine1="coucou" >>> maChaine2="les amis" >>> chaineFinale=maChaine1+" "+maChaine2 >>> print chaineFinale coucou les amis Simple... Conversion d'une valeur numérique en chaîne de caractères Une première chose qu'il est utile de savoir faire en pratique : convertir une valeur numérique en chaîne de caractères. Ceci est obligatoire lorsque l'on souhaite intégrer une valeur numérique dans une chaîne passée en paramètre à une fonction. Exemple : >>> a=321 >>> print "valeur" + a Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> print "valeur" + a TypeError: cannot concatenate 'str' and 'int' objects On obtient un message d'erreur ! Qu'est-ce qui se passe ici : la chaîne est considérée logiquement comme un type str mais la valeur numérique est considérée comme un int. On peut le vérifier simplement : >>> type(a) 0: <type 'int'> >>> type("valeur") 1: <type 'str'> Le signe + correspond à une concaténation (= fusion ) pour les chaînes mais à une addition pour les valeurs numériques. Pour résoudre ce problème, il faut simplement « caster », c'est à dire transformer le int en str ce qui se fait en faisant : str(variable). Notre exemple devient : >>> a=321 >>> print "valeur = "+ str(a) valeur = 321 Cette fois, l'association des chaînes a bien fonctionné car les 2 éléments sont de type str. Bien que le langage Python attribue automatiquement les types, cet exemple montre qu'il est important lorsque l'on utilise le langage Python d'être conscient du type attribué par Python à tel ou tel élément pour comprendre les messages d'erreur et pouvoir les résoudre simplement. Cette situation consistant à « caster » une variable numérique en chaîne sera rencontrée fréquemment. Donc retenez çà. Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 6 / 17 Conversion d'une chaîne de caractères en valeur numérique Une autre situation que l'on rencontre souvent : extraire une valeur numérique à partir d'une chaîne. Typiquement, on obtiendra une chaîne à partir d'une saisie utilisateur ou bien une réception sur le port série ou le réseau. Exemple : >>> a="123" >>> a=a+3 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> a=a+3 TypeError: cannot concatenate 'str' and 'int' objects Cette fois, on retrouve le même message d'erreur que précédemment, mais ici nous voulions le résultat opposé : réalisé une opération mathématique sur la valeur a, défini ici comme une chaîne. Il va falloir là encore « caster » la variable, c'est à dire la transformer dans un type numérique, au choix int, long ou float, ce qui donne : >>> a="123" >>> a=int(a)+3 >>> print a 126 >>> type(a) 0: <type 'int'> On ferait de même pour avoir une valeur float en posant float(variable). Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 7 / 17 Vérifier si tous les caractères d'une chaîne sont des chiffres Avant de convertir une chaîne en valeur numérique comme nous venons de le voir, il est utile de vérifier au préalable qu'elle n'est bien constituée que de chiffres. Le type str du langage Python dispose de la fonction isdigit() pour réaliser cela simplement. Exemple : >>> a="123" >>> if a.isdigit(): ... print "que des chiffres" ... print "valeur = " + int(a) ... else: ... print "pas que des chiffres" que des chiffres et : >>> a="123ab" >>> if a.isdigit(): ... print "que des chiffres" ... print "valeur = " + a ... else: ... print "pas que des chiffres" pas que des chiffres Une fonction comparable existe pour tester si une chaîne ne contient que des caractères alpha-numériques : isalnum(). Exemple : >>> a="123ab ;" >>> if a.isalnum(): ... print "que des chiffres et lettres" ... else: ... print "pas que des chiffres et lettres" Moins utile, mais à ne pas confondre isalnum() et isdigit() Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 8 / 17 Scinder une chaîne Scinder une chaîne à l'aide d'un caractère de séparation Une opération que l'on peut être fréquemment amené à réaliser sur une chaîne : la « couper » en sous-chaînes séparées par un séparateur précis. Par exemple, couper la chaîne « coucou, salut, hello » en « coucou » « salut » et « hello ». La fonction qui permet cela est la fonction split du type str : cette fonction reçoit en paramètre le séparateur et renvoie un objet list contenant toutes les sous-chaînes obtenues. Un petit exemple d'application : >>> chaine="coucou,salut,hello" >>> print chaine coucou, salut, hello >>> mots=chaine.split(',') >>> print mots ['coucou', 'salut', 'hello'] On peut facilement vérifier que notre objet mots est un objet list : >>> type(mots) 1: <type 'list'> Il est ensuite assez facile d'accéder à chaque élément individuellement : >>> for i in range(0,len(mots),1): ... print mots[i] coucou salut hello Noter que chaque élément est un type str : >>> type(mots[0]) 2: <type 'str'> Voir : http://docs.python.org/2/library/stdtypes.html#str.split Scinder une chaîne multi-lignes en lignes Une opération très pratique est la possibilité de scinder une chaîne multilignes en lignes individuelles, simplement à l'aide de la fonction splitlines() de l'objet str. Par exemple : >>> chaine=""" Bonjour les amis. ... Comment allez-vous ? ... Moi je vais bien ... """ Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 9 / 17 >>> chaine.splitlines() [' Bonjour les amis.', 'Comment allez-vous ?', 'Moi je vais bien'] On obtient une liste contenant les chaînes correspondant aux lignes. Noter que le caractère de fin de ligne est exclu des lignes obtenues. Voir : http://docs.python.org/2/library/stdtypes.html#str.splitlines Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 10 / 17 Rechercher une sous-chaîne dans une chaîne Plusieurs fonctions permettent également d'analyser une chaîne et d'y rechercher une sous-chaîne précise. Tout d'abord, l'opérateur in renvoie True si la chaîne recherchée est présente dans la chaîne analysée : >>> "ou" in "coucou" 1: True >>> "on" in "coucou" 2: False Plus précise, la fonction find() renvoie l'index de la première occurrence d'une sous-chaîne au sein d'une chaîne. find() renvoie -1 si la sous-chaîne n'est pas retrouvée. Exemple : >>> chaine="coucou" >>> chaine.find("ou") 5: 1 >>> chaine.find("on") 6: -1 Si on veut compter le nombre d'occurrences d'une sous-chaîne dans une chaîne, on fera : >>> chaine="coucou" >>> chaine.count("ou") 2 Pratique également, la fonction startswith qui permet de tester si une chaîne commence par une sous-chaîne précise. Exemple : >>> requete="GET /page.html HTTP/1.1" >>> requete.startswith("GET") 7: True A l'inverse, la chaîne endswith permet de tester si une chaîne se termine bien par une sous-chaîne précise : >>> chaine="valeur=245=:" >>> chaine.endswith("=:") 9: True Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 11 / 17 Extraire sous chaînes à partir des index Voici une des fonctionnalités les plus puissantes du langage Python : ce que l'on appelle le slicing, la possibilité de facilement extraire des éléments d'une liste, d'une chaîne de caractères, etc... Le principe est le suivant : • on utilise le : pour signifier les éléments quelconques • on utilise l'indice pour signifier un élément précis, • on place le tout entre [ ] après le nom de la chaîne. Par exemple, soit la chaine : >>> chaine="0123456789" Pour extraire les caractères du début à l'indice 5, on fera : >>> chaine[:5] 0: '01234' Pour extraire les caractères de l'indice 5 à la fin, on fera : >>> chaine[5:] 2: '56789' Pour extraire les caractères de l'indice 3 à l'indice 7, on fera : >>> chaine[3:7] 1: '3456' Cool non ? Encore mieux : la même chose à l'envers... Par exemple, pour extraire les 2 derniers caractères d'une chaîne, on fera : >>> chaine[-2:] 3: '89' Encore plus fort : extraire 1 élément sur 2 d'une chaine : >>> chaine[::2] 4: '02468' Noter que del ne fonctionne pas avec un objet str Retenez bien ce système de notation car il vous servira souvent, aussi bien avec des listes, des chaînes de caractères que des tableau Numpy, etc... Très pratique et puissant ! Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 12 / 17 Pour plus de détails, voir : http://docs.python.org/2/tutorial/introduction.html http://docs.python.org/release/2.3.5/whatsnew/section-slices.html Autres fonctions Nous venons de voir quelques fonctions essentielles en pratique pour manipuler des chaînes de caractères. Cependant, les fonctions de l'objet str sont beaucoup plus nombreuses et vous les découvrirez à l'usage selon vos besoin. Voir ici : http://docs.python.org/2/library/stdtypes.html#string-methods Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 13 / 17 Caractères spéciaux Il est bien sûr possible d'insérer les caractères spéciaux dans les chaînes de caractères en faisant précéder le symbole du caractère d'un \ Les plus utiles sont : • \n : saut de ligne • \t : tabulation Exemples : >>> print "\tcoucou" coucou >>> print "coucou\n" coucou >>> Remarque : la fonction « print » de la console intègre automatiquement un saut de ligne. Pour éviter le saut de ligne, ajouter simplement une virgule en fin d'instruction. Exemple : >>> for i in range(10): ... print i 0 1 2 3 4 5 6 7 8 9 >>> for i in range(10): ... print i, 0123456789 A savoir : des possibilités avancées de formatage et de traitement des chaînes de caractères Le type str du langage Python dispose de fonctionnalités de formatage des chaînes assez élaborées, qui ne sont pas indispensables à connaître dans une première approche, mais que l'on pourra prendre le temps de découvrir à l'occasion : http://docs.python.org/2/library/stdtypes.html#string-formattingoperations D'autre part, le langage Python dispose de librairies externes ( ou modules, on verra çà par la suite) qui étendent encore davantage au besoin les possibilités de traitement et de formatage des chaînes de caractères en Python : Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 14 / 17 • le module string pour le formatage des chaînes de caractères : http://docs.python.org/2/library/string.html#module-string • le module re pour l'utilisation des « expressions régulières » qui permettent des analyses avancées des chaînes de caractères : http://docs.python.org/2/library/re.html#module-re Nous présenterons tout ceci ultérieurement, mais cela n'est pas indispensable à connaître dans une première approche. Truc avancé : Exécuter une chaîne de caractère en tant que fonction Python Une dernière chose qui pourra vous être utile à l'occasion : il est possible d'exécuter une chaîne de caractère en tant qu'instruction Python avec la fonction eval(). L'utilisation de cette fonction n'est pas recommandée, mais il est des situations où cela peut être pratique. Par exemple, imaginons que l'on réalise une interface avec une zone texte dans laquelle il est possible de saisir une formule : il sera ainsi possible de rendre l'application puissamment interactive. Par exemple, voici un calcul réalisé de la sorte : >>> x=23 >>> chaine="(x*3)+2" >>> print eval(chaine) 71 En pratique, ceci est déconseillé car cela peut créer des failles de sécurité significatives. Conclusion A ce stade, vous avez les rudiments pour utiliser efficacement les chaînes de caractères en langage Python. N'hésitez pas à faire vos propres essais dans votre interpréteur favori, c'est comme çà qu'on apprend à coder ! Et maîtriser ces choses en apparence simple vous simplifiera grandement l'existence lorsque vous attaquerez des codages plus complexes. Remarque ... Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 15 / 17 Conclusion Les instructions du langage Python vue dans ce tuto …. Exercices Trouver la chaîne la plus longue et son indice de début dans une suite de caractères : #!/usr/bin/python # -*- coding: utf-8 -*#!/usr/bin/python # -*- coding: utf-8 -*# test.py import re test="001100220000000222211110022111100222110001110001100011001122222220011" resultList= [ [i.start(), i.end()-i.start()] for i in re.finditer('0+', test)] # liste des indexStart / longeur lenList= [j[1] for j in resultList] # liste des longueurs des chaines trouvées Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 16 / 17 #lenList=list(zip(*resultList))[1] # idem index=lenList.index(max(lenList)) # l'index de la chaine la plus longue indexStart=resultList[index][0] # l'index du début de la chaine la plus longue print (resultList) print (lenList) print (index) print (indexStart) Ateliers Python : Les chaînes de caractères.– Par X. HINAULT – p. 17 / 17