TP4 Chaînes - FR

publicité
IGI-3008 – ESIEE Paris – 2016-2017
Figure 1 — Un extrait des tables Unicode
Apprentissage de la Programmation avec Python
TP4
Jean-Claude GEORGES
Retour sur les chaînes de caractères
Fonctions et méthodes
Les chaînes de caractères sont des objets indexés (dont les composants sont numérotés)
non modifiables. Outre les littéraux, on peut créer une chaîne en utilisant sa valeur Unicode
ou son nom (hélas en anglais).
Exercice 1 — Chaînes bizarres
Que contiennent les chaînes suivantes ?
>>> '\u2713'
>>> "Utilisez '\N{MULTIPLICATION SIGN}' ou '\u00d7' pour \
afficher un signe
de multiplication"
>>> "\N{WHITE SMILING FACE}"
>>> '\u0627\u0628\u0648\u062c\u0639\u0641\u0631\u0020\u0645\u062d\u0645\
\u062f\u0020\u0628\u0646\u0020\u0645\u0648\u0633\u06cc\u0020\u062e\u0648\
\u0627\u0631\u0632\u0645\u06cc'
Les listes des caractères Unicode et de leurs noms associés est disponible à l’adresse
I http://www.unicode.org/charts/ (attention, toutes les machines ne disposent pas de
tous les caractères)
Figure 2 — Les noms Unicode
FONCTIONS ET MÉTHODES
2
L’indexation s[i] permet d’extraire un caractère unique de la chaîne. La découpe (slicing)
s[d:f:p] permet de créer une nouvelle chaîne construite à partir de la chaîne de départ.
Figure 3 — Indexation et slicing
Les numérotations se font comme indiqué Fig. 3.
Exercice 2 — Indexation et slicing
Avec >>> s = "0123456789", que donneront les commandes suivantes ?
>>> s[3]
>>> s[-1]
>>> s[0]
>>> s[-3]
>>> s[40]
>>> s[-40]
>>> s[3:8]
>>> s[8:3]
>>> s[:8]
>>> s[3:]
>>> s[:]
>>> s[-8:-3]
>>> s[:-3]
>>> s[-8:]
>>> s[3:8:2]
>>> s[:8:3]
>>> s[2::2]
>>> s[::2]
>>> s[-3:-8:-2]
>>> s[-2::-3]
>>> s[:2:-3]
>>> s[::-1]
Figure 4 — Pourquoi changement de casse
On parle de casse en imprimerie, car avant les ordinateurs, les
caractères (cassetins) en plomb étaient rangés dans des caisses,
avec en bas les minuscules et en haut les majuscules.
Exercice 3 — Changement de casse
Avec >>> s = "Un EXEMPLE de Chaîne de Caractères", que donneront les commandes
suivantes ?
>>> s.lower()
>>> s.upper()
>>> s.capitalize()
>>> s.title()
>>> s.swapcase()
TP4
IGI-3008 (2016-2017)
FONCTIONS ET MÉTHODES
3
D’autres opérateurs, fonctions ou méthodes sont utilisables sur les chaînes.
Exercice 4 — Tests
Avec s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf",
que donneront les commandes suivantes ?
>>> "Jack" in s
>>> "Jacky" in s
def inferieur(s1, s2) :
i = 0
while i < len(s1) and i < len(s2) :
if ord(s1[i]) == ord(s2[i]) : # si c1 == c2 (en Unicode)
i += 1 # on passe au suivant
continue
else : # si c1 != c2 ()en Unicode)
return ord(s1[i]) < ord(s2[i]) # c1 < c2
else : # si s1 ou s2 est terminé
return len(s1)<len(s2) # s1 doit être plus court que s2
Pour les règles de l’ordre lexicographique en français et
leur programmation, voir I http://www-clips.imag.fr/geta/
>>> "" in s
gilles.serasset/tri-du-francais.html
>>> s.startswith("monsieur")
>>> s.endswith("olf")
>>> "Python" == "Python"
>>> "Python" < "Python.3"
>>> "Python.2" < "Python.3"
>>> "Python" == "python"
>>> "Python" <= "python"
>>> "Zorro" < "cavalier"
>>> "a" < "b"
>>> "à" < "b"
>>> "a123".isalnum() ;"a12 3".isalnum()
>>> "Python".isalpha() ;"Pyth0n".isalpha()
>>> "123".isdigit() ;"12.3".isdigit() ;"-12".isdigit()
>>> "A2".isidentifier() ;"2A".isidentifier() ;
>>> "arrière-grand-mère".islower() ;"Blanche-Neige et les 7 nains".islower()
>>> "VOL 714 POUR SIDNEY".isupper() ;"VOL 714 POUR SlDNEY".isupper()
>>> " ".isprintable() ;"tabulation \t".isprintable()
>>> "\n\t ".isspace()
TP4
Figure 5 — Comparaisons lexicographiques
On remarque que les comparaisons sur les chaînes ne sont pas
lexicographiques (ordre du dictionnaire). Elles suivent l’ordre
Unicode. Le programme Python équivalent à la comparaison <
est le suivant :
IGI-3008 (2016-2017)
FONCTIONS ET MÉTHODES
4
Exercice 5 — Suppression/ajout/remplacement
Que donneront les commandes suivantes ?
>>> "12".zfill(5)
>>> "
\t\n suppression des espaces à gauche
>>> "
suppression des espaces à droite
\t\n ".rstrip()
".lstrip()
>>> "
suppression des espaces à droite
et à gauche
\t\n ".strip()
>>> s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf"
>>> t = s.replace('ami', 'copain')
>>> print(s)
>>> print(t)
Exercice 6 — Comptage et recherche
Avec s = "Monsieur Jack, vous dactylographiez bien mieux que votre ami Wolf",
que donneront les commandes suivantes ?
len(s) ; s.count('e') ; s.count('ie')
s.find('i') ; s.find('i',40) ; s.find('i',20,30) ; s.rfind('i')
s.index('i') ; s.index('i',40) ; s.index('i',20,30)
;s.rindex('i')
Écrivez un programme qui vérifie que toutes les lettres de l’alphabet sont contenues
dans une chaîne s (qui vérifie que s est un pangramme, voir Fig. 6). On se limitera aux
chaînes en minuscules et sans accent.
TP4
IGI-3008 (2016-2017)
Figure 6 — Pangrammes
Un pangramme contient toutes les lettres de l’alphabet. Deux
exemples classiques :
Portez ce vieux whisky au juge blond qui fume
The quick brown fox jumps over the lazy dog.
Plus fort encore, ce pangramme de Gilles Esposito-Farèse, qui
contient toutes les lettres accentuées et ligatures du français :
Dès Noël où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis
rôtis de bœuf au kir à l’aÿ d’âge mûr et cætera !
FONCTIONS ET MÉTHODES
5
Exercice 7 — Partitions
Figure 7 — L’aide pour la méthode partition
Que donneront les commandes suivantes ?
>>> "Une chaîne à découper".partition('à')
>>> help(str.partition)
Help on method_descriptor :
>>> "Une chaîne à découper".partition('et')
partition(...)
S.partition(sep) -> (head, sep, tail)
>>> "Une chaîne à découper".partition(' ')
Search for the separator sep in S, and return the part before it,
the separator itself, and the part after it. If the separator is not
found, return S and two empty strings.
>>> "Une chaîne à découper".split(' ')
>>> "Une chaîne à découper".split(' ',2)
>>> "Une chaîne à découper".split('e')
>>> """Un texte
Figure 8 — L’aide pour la méthode split
sur
>>> help(str.split)
Help on method_descriptor :
plusieurs
lignes""".splitlines()
>>> mots = " Une chaîne
split(...)
S.split(sep=None, maxsplit=-1) -> list of strings
à
découper en
mots
".split()
>>> mots
Return a list of the words in S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are
removed from the result.
>>> ' '.join(mots)
Figure 9 — L’aide pour la méthode join
>>> help(str.join)
Help on method_descriptor :
join(...)
S.join(iterable) -> str
Return a string which is the concatenation of the strings in the
iterable. The separator between elements is S.
TP4
IGI-3008 (2016-2017)
EXERCICES DE SYNTHÈSE
6
Exercices de synthèse
Normalisation d’un mot français
On a vu dans l’exercice 4 que les comparaisons sur les chaînes de caractères ne sont pas
compatibles avec l’ordre alphabétique français.
Exercice 8 — Normalisation d’un caractère
Créez une fonction normalise_lettre qui retourne la (ou les) lettre(s) minuscule(s)
correspondant au caractère de longueur 1 passé en paramètre, les caractères non lettres
restant inchangés (’Z’ → ’z’, ’é’ → ’e’, ’œ’ → ’oe’, ’8’ → ’8’, ’ ?’ → ’ ?’ ).
Figure 10 — Diacritiques et ligatures
Il existe en français :
- 16 lettres avec diacritiques : à â ä ç é è ê ë î ï ô ö ù û ü ÿ
- 2 ligatures : æ, œ
auxquelles on peut ajouter des lettres présentes dans certains
dictionnaires pour des mots d’origine étrangère comme ñ (cañon),
å (ångström) ou ō (Tōkyō)
Exercice 9 — Normalisation d’un mot
Créez une fonction normalise_texte qui retourne la chaîne minuscule du texte passé
en paramètre, avec ses lettres accentuées ou cédillées converties en lettres normales et les
ligatures séparées (’ZÈBRE’ → ’zebre’, ’bœuf’ → ’boeuf’). Testez cette fonction avec la
chaîne suivante :
Dès Noël où un zéphyr haï me vêt de glaçons würmiens, je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge
mûr et cætera !
Figure 11 — Quelques palindromes à tester
Engage le jeu que je le gagne.
Tu l’as trop écrasé, César, ce Port-Salut !
Saippuakivikauppias (marchand de pierre de savon en finnois)
et le plus vieux dialogue (trilogue ?) palindromique du monde :
– Madam, I’m Adam !
– Eve.
– Ssssssss...
Exercice 10 — Palindrome
Écrivez les fonctions nécessaires à vérifier qu’un texte est un palindrome.
Une erreur de transcription fait que le texte trouvé sur ce site indiqué Fig. 12 n’est pas
un palindrome : trouvez la correction à faire dans le texte pour qu’il devienne un vrai
palindrome.
Figure 12 — Un palindrome géant
Le site I http://homepage.urbanet.ch/cruci.com/lexique/
palindrome.htm nous donne le palindrome record de Georges
Perec.
Trace l’inégal palindrome ...... e mord ni la plage ni l’écart.
Georges Perec, La clôture et autre poèmes, Hachette,
1980
TP4
IGI-3008 (2016-2017)
Téléchargement