TP 6 Chaˆınes de caract`eres 24
TP 6 Chaˆınes de caract`eres
Cr´eez un nouveau r´epertoire de travail Z:\Prog\TP6 pour les scripts de ce TP.
6.1 esum´e du cours
6.1.1 Chaˆıne et indi¸cage
Les chaˆınes de caract`eres sont des objets Python, qui (comme les tableaux) peuvent ˆetre manipul´ees en tant que
variables indic´ees : chaque caract`ere de la chaine est accessible par la notation
chaine[indice] o`u l’indice est un entier allant de 0 jusqu’`a len(chaine)-1. le nombre de caract`ere de la chaˆıne
est fournit par la fonction int´egr´ee len. Ainsi :
maChaine[0] est le premier caract`ere de maChaine ;
maChaine[1] est le deuxi`eme caract`ere de maChaine ;
...
maChaine[len(maChaine)-1] est le dernier caract`ere de maChaine.
Les indices peuvent ˆetre des nombres n´egatifs (commen¸cant `a 1), pour compter les caract`eres `a partir de la
fin (de droite `a gauche).
6.1.2 Slicing
Python permet aussi de r´ecup´erer une sous-chaˆıne par la technique dite de slicing : les caract`eres de la sous-
chaˆıne sont indic´es dans un intervalle de la forme : [indiceDebut:indideFin]. Par exemple :
1>>>maChaine=u " L ’ hippopotomonstrosesquip´e daliophobie est la peur des mots trop long."
2>>>maChaine[:2]
3" L ’"
4>>>maChaine[0:2]
5" L ’"
6>>>maChaine[2:37]
7"hippopotomonstrosesquip´e daliophobie"
8>>>maChaine[39:]
9"est la peur des mots trop long."
6.1.3 Caract`eres sp´eciaux (non imprimables)
Une chaˆıne peut comporter des caract`eres sp´eciaux, des caract`eres non imprimables. Par exemple :
le retour chariot est ’\n’
la tabulation est ’\t’
le backslash est ’\\’ .
L’apostrophe peut ˆetre ´echapp´ee par \si elle doit apparaitre dans une chaˆıne d´elimit´ee par des apostrophes. Il
en est de mˆeme pour les guillemets. Une chaˆıne peut ˆetre d´eclar´ee sur plusieurs lignes. Elle est d´elimit´ee alors
par des triples guillemets (""").
6.1.4 Des objets non mutables
Les chaˆınes ne sont pas mutables c’est-`a-dire qu’une partie de chaˆıne ne peut pas ˆetre modifi´ee ind´ependamment.
Ainsi la mise en majuscule du premier caract`ere de maChaine = ’une phrase’ n’est pas possible par maChaine[0]
="U" mais par maChaine = "U"+ maChaine[1:].
6.1.5 Fonctions et m´ethodes pour les chaines
Cf. http://docs.python.org/library/string.html#module-string et plus particuli`erement les sec-
tions 7.1.1 et 7.1.6, traitant de la biblioth`eque string efinissant des constantes utiles
Cf. http://docs.python.org/library/stdtypes.html#string-methods traitant de la classe str et de
ses m´ethodes
TP 6 Chaˆınes de caract`eres 25
6.2 Manipulations basiques des index et du slicing
Dans l’interpr´eteur Python, d´eclarez la variable maChaine contenant "D´e finitivement, j’aime Python!" (ou
tout autre texte de votre choix). Trouvez et testez les expressions qui achent : 1le premier caract`ere de la chaine,
2le dernier (2 possibilit´es), 3les trois premiers caract`eres de la chaine, 4les trois derniers (2 possibilit´es), 5les
caract`eres entre le troisi`eme et l’avant-dernier.
Que se passe-t-il lorsque l’un des indices de d´ecoupage (slicing ) d’une chaine est erron´e ? On testera notamment le
cas o`u le second indice est plus petit que le premier, et le cas o`u le second indice est plus grand que la taille de la
chaine.
Programme achageSimple.py :Dans le script nomm´e affichageSimple.py, ´ecrivez (comme en TD)
un programme qui demande la saisie d’une chaˆıne puis ache chaque caract`ere de celle-ci sur une nouvelle ligne.
Programme recherche.py :Dans un script Python nomm´e recherche.py, on souhaite programmer une
fonction de recherche ´equivalente `a la ethode find de la classe str.
A: ´
Ecrivez une fonction trouve(chaine, caractere) ayant deux param`etres chaine et caractere qui cherche
si le caractere est pesent dans la chaine, et si oui, renvoie l’indice de la premi`ere occurrence du caract`ere
trouv´e dans la chaˆıne. Si le caract`ere n’est pas trouv´e, la fonction renverra 1. La fonction ´ecrite ne devra
(bien entendu) pas utiliser la m´ethode find ni la m´ethode index.
Par exemple, trouve("Bonnie et Clyde","e")devra renvoyer 5, tandis que l’instruction : trouve("Bonnie
et Clyde","a")devra renvoyer 1.
Testez votre fonction dans le programme principal avec les exemples ci-dessus et comparez les r´esultats avec
ceux de la m´ethode find de la classe str.
B: Am´eliorez la fonction trouve(chaine, caractere) pec´edente en impl´ementant une nouvelle fonction
trouveV2(chaine, caractere, indiceDebut) ayant un troisi`eme param`etre : l’indice `a partir duquel la re-
cherche doit s’eectuer dans la chaˆıne. Comme pec´edemment, trouveV2(chaine, caractere, indiceDebut)
renvoie l’indice de la premi`ere occurrence de caractere dans chaine, mais en commen¸cant cette fois la
recherche dans la chaine `a partir du caract`ere d’indice indiceDebut.
Ainsi, l’instruction : trouveV2("Tarzan et Jane","a", 2) devra renvoyer : 4(et non 1, l’indice du premier
’a’ ! qui est inf´erieur `a l’indice du d´ebut de la recherche). De mˆeme, trouveV2("Tarzan et Jane","a", 7)
devra renvoyer : 11.
Testez cette fonction en comparant son r´esultat `a celui de la m´ethode find (utilis´ee avec deux param`etres).
On pourra chercher une solution utilisant trouve et un slicing.
C: Am´eliorez la fonction trouveV2(chaine, caractere, indiceDebut) pr´ec´edente en impl´ementant la fonction
trouveV3(chaine, caractere, indiceDebut, indiceFin) ayant un quatri`eme param`etre : l’indice `a la fin
duquel la recherche doit s’eectuer. Ainsi, l’instruction : trouveV3("Cyrano et Roxane","o", 6, 10) devra
renvoyer -1 . On pourra aussi chercher une solution utilisant trouve ou trouveV2 et un slicing.
Testez cette fonction en comparant son r´esultat `a celui de la m´ethode find (utilis´ee avec trois param`etres).
6.3 Un peu de cryptographie sur les chaˆınes
La cryptographie (voir http://fr.wikipedia.org/wiki/Cryptographie) est l’art de rendre illisible un mes-
sage pour qui ne d´etient pas un secret (ou cl´e) permettant de d´echirer ce message. Diverses techniques ont
travers´e l’Histoire, les plus anciennes et simples ´etant celles qui traitent de caract`eres, dans un alphabet minimum
ne comportant que des lettres majuscules et sans ponctuation.
Une biblioth`eque Python, nomm´ee crypto, est disponible sur le site du TP pour faciliter ce traitement. Cette
biblioth`eque est contenue dans le fichier crypto.pyc qui doit ˆetre copi´e dans votre r´epertoire de travail. Vos
scripts Python utilisant la biblioth`eque doivent comporter la directive d’import import crypto en d´ebut de
script. Cette biblioth`eque comporte les fonctions :
3crypto.formatChaine(chaine) : renvoie la chaine pass´ee en param`etre sans d’autres caract`eres que des
lettres en majuscules sans accents, c´edilles etc.
TP 6 Chaˆınes de caract`eres 26
3crypto.suppDiacritique(chaine) : renvoie la chaine pass´ee en param`etre sans les diacritiques fran¸caises
(c’est-`a-dire les accents, les c´edilles, etc.)
Programme rot13.py :Le chirement ROT13 s’obtient en d´ecalant chaque caract`ere de la chaˆıne initiale
de 13 rangs dans l’ordre alphab´etique (voir http://fr.wikipedia.org/wiki/ROT13). L’avantage de cette m´ethode
de chirement est que le d´ecryptage est identique au cryptage dans le cas d’un alphabet de 26 lettres.
Dans un script Python nomm´e rot13.py, ´ecrivez une fonction ROT13(chaine) qui eectue le cryptage ROT13 d’une
chaˆıne de caract`ere pass´ee en param`etre. La fonction renvoie la chaˆıne crypt´ee.
Vous pourrez utiliser :
la fonction crypto.formatChaine( chaine )
la constante string.uppercase (chaˆıne des majuscules)
la m´ethode chaine.find( sousChaine ) appliqu´ee aux chaˆınes (voir http://docs.python.org/2.7/library/
stdtypes.html#string-methods).
V´erifiez le bon fonctionnement de la fonction ROT13 dans le programme principal en achant un texte `a crypter, le
texte crypt´e par ROT13 puis d´ecrypt´e.
Programme cesar.py :Le chire de C´esar (voir http://fr.wikipedia.org/wiki/Chirement par ecalage)
est une g´en´eralisation de la technique ROT13 : chaque caract`ere du message chie correspond au caract`ere du
message en clair d´ecal´e d’un nombre entier quelconque modulo 26. Ce nombre est la cl´e secr`ete permettant de
echirer le message.
Dans un script Python nomm´e cesar.py :
1. ´
Ecrivez une fonction cesar(chaine, cle) qui r´ealise le chirement de la chaine pass´ee en param`etre suivant la
technique du chire de C´esar utilisant l’entier cle pass´e en param`etre. La fonction renverra la chaˆıne crypt´ee.
2. ´
Ecrivez ensuite la fonction rasec(chaineCryptee, cle) qui d´ecrypte la chaineCryptee pass´ee en param`etre
avec la cle fournie. En r´efl´echissant un peu cette fonction ne contient qu’une ligne...
3. ´
Ecrivez enfin un programme qui demande `a l’utilisateur de saisir une chaine puis un entier positif (la saisie
conforme de ce nombre ´etant `a v´erifier). Le programme transformera ensuite la chaine pour ne garder que
des majuscules (en utilisant la fonction formatChaine(chaine)) puis appelle la fonction cesar(chaine, cle)
pour crypter la chaine suivant le chire de C´esar avec pour cl´e l’entier saisi. Le programme achera la chaine
crypt´ee sur la console. Enfin, il utilisera la fonction rasec(chaineCryptee, cle) pour d´ecrypter la chaine et
achera le r´esultat d´ecrypt´e sur la console pour v´erifier le bon fonctionnement de cesar.
Programme cryptanalyse.py :La cryptanalyse est l’art de d´ecoder un message crypt´e sans poss´eder
la cl´e de chirement. On souhaite ici eectuer la cryptanalyse d’un message cod´e par le chire de C´esar (voir
http://fr.wikipedia.org/wiki/Chirement par ecalage#Analyse fr´equentielle) : la lettre ”E” ´etant de loin la plus
utilis´ee statistiquement dans le vocabulaire fran¸cais ou anglais, il y a de fortes chances pour que la lettre la plus
fr´equente dans le message chir´e corresponde `a la lettre ”E”. La cl´e pourra donc ˆetre d´eduite du d´ecalage entre
l’index du caract`ere le plus fr´equent dans le texte crypt´e et l’index de ”E”. On parle de cryptanalyse par analyse
fr´equentielle.
Cette approche revient `a ´evaluer le nombre d’occurrence de chacune des lettres de l’alphabet dans le message et
`a m´emoriser le plus grand eectif ainsi que la lettre la plus fr´equente qui lui correspond. La cl´e du chirement est
l’index de la lettre d´ecal´e de l’index de ”E”.
Dans un script Python nomm´e cryptanalyse.py, ´ecrivez une fonction cryptanalyse( chaineCryptee ) qui eectue
la cryptanalyse de la chaineCryptee pass´ee en argument et renvoie la valeur de la cl´e permettant de d´echirer
correctement le message.
Vous pourrez utiliser la m´ethode chaine.count( sub ) qui renvoie le nombre total d’occurrence de sub dans chaine
et la m´ethode chaine.index( val ) qui renvoie l’index du premier ´el´ement de la liste qui contient la valeur val.
R´eutilisez les fonctions cesar (et rasec) dans le programme principal pour tester la fonction cryptanalyse.
Pour que la cryptanalyse fonctionne bien il faut un long texte comme :
le PEP20 (ach´e dans l’interpeteur de commande par >>>import this)
ou la traduction fran¸caise propos´ee par C´ecile TREVIAN et Bob CORDEAU :
TP 6 Chaˆınes de caract`eres 27
Pr´ef`ere :
la beaut´e `a la laideur,
l’explicite `a l’implicite,
le simple au complexe
et le complexe au compliqu´e,
le d´eroul´e `a l’imbriqu´e,
l’a´er´e au compact.
Prends en compte la lisibilit´e.
Les cas particuliers ne le sont jamais assez pour violer les r`egles.
Mais, `a la puret´e, privil´egie l’aspect pratique.
Ne passe pas les erreurs sous silence,
... ou b^aillonne-les explicitement.
Face `a l’ambig¨uit´e, `a deviner ne te laisse pas aller.
Sache qu’il ne devrait avoir qu’une et une seule fa¸con de proc´eder,
m^eme si, de prime abord, elle n’est pas ´evidente, `a moins d’^etre N´eerlandais.
Mieux vaut maintenant que jamais.
Cependant jamais est souvent mieux qu’imm´ediatement.
Si l’impl´ementation s’explique difficilement, c’est une mauvaise id´ee.
Si l’impl´ementation s’explique ais´ement, c’est peut-^etre une bonne id´ee.
Les espaces de nommage ! Sacr´ee bonne id´ee ! Faisons plus de trucs comme ¸ca.
Ces textes sont disponibles sur le site du TP.
Programme vigenere.py :(Pour les ´etudiants bien avanc´es)
Lisez http://fr.wikipedia.org/wiki/Chirement de Vigen`ere.
Dans un script Python nomm´e vigenere.py, r´eutilisez la fonction cesar et ´ecrivez une fonction
vigenere( message, cle ) qui renvoie une chaˆıne crypt´ee par le chire de Vigen`ere. Le param`etre message contient
une chaˆıne `a crypter et le param`etre cle est une chaˆıne contenant le secret de cryptage. Pensez `a utiliser l’op´erateur
modulo : %.
V´erifiez le fonctionnement de vigenere dans le programme principal avec l’exemple de Wikip´edia puis ´ecrivez la
fonction erenegiv( message, cle ) qui r´ealise le d´ecryptage d’un message chie.
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !