Deux détails plutôt hard • Deux détails plutôt hard Expressions

Transcription

Deux détails plutôt hard • Deux détails plutôt hard Expressions
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Deux détails plutôt hard
•
• [Python 2.x] si le programme contient des caractères nationaux
madate.py
ou rares il faut indiquer le système de codage :
Deux détails plutôt hard
• rendre le fichier « exécutable » (UNIX)
madate.py
#!/usr/bin/python3
# coding: utf-8
# coding: utf-8
import datetime
listeMois = [ "janvier", "février", … "août", … "décembre" ]
import datetime
listeMois = [ "janvier", "février", … "août", … "décembre" ]
listeJours = [ "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendre
suivi de :
2.
[Python 3.x] si on n'indique rien, par défaut le codage est utf-8
3.
Sous Linux/UNIX ou OS X, l'encodage par défaut est par défaut utf-8
$ chmod +x madate.py
alors, pour exécuter le script :
$ ./madate.py
4.
autre cas fréquent (Windows) :
# coding: cp-1252 # encodage propriétaire Microsoft
# coding: iso-8859-1 (ou latin-1) # encodage OSI 99% compatible M$
# coding: iso-8859-15 (ou latin-9) # latin-1 + symboles €, Œ, œ
5.
Vérifiez quand vous « enregistrez-sous ... », l'encodage utilisé.
Cours_6_4
© L. Tichit, 03/09/16
page 1
Expressions régulières - Exceptions
• De cette façon, votre script python peut être exécuté de la même manière
que n'importe quelle autre commande du système (pas besoin d'appel
explicite à l'interpréteur)
• Pas nécessaire pour PS1/PS2 mais utile pour PW au second semestre
lorsque vos scripts auront besoin d'être appelés par un serveur web
Cours_6_4
© L. Tichit, 03/09/16
Expressions régulières - Exceptions
Expressions régulières
Expression régulière : principe
• on a des fonctions pour lire des chaînes de caractères,
comment en extraire les données qu’elles expriment ?
• une formule E définissant un ensemble de chaînes de caractères L(E)
• si c’était en français :



• cas simple : la chaîne se réduit à l’expression correcte d’un nombre :
x = float(s)
• moins simple : la chaîne englobe une ou plusieurs données dans une
« gangue » d’où il faut les extraire



taxon:10116
mRNA
Rattus norvegicus


• expressions régulières : outil précieux pour ce genre de tâches
Cours_6_4
© L. Tichit, 03/09/16
E = abc
L(E) = { abc }
E = a[xyz]c
L(E) = { axc, ayc, azc }
E = [a-z][a-z0-9]* L(E) = { i, x2, poids, tk03, … }
• étant donnée une exp.rég. E on sait construire un algorithme AE
qui pour toute chaîne s répond à la question s  L(E) ?
AE est appelé automate (ou automate d’états fini) associé à E
• si s  L(E) on dit
l’information convoitée est un ensemble de paires (clé, valeur) :
etc.
L(« a suivi de b suivi de c ») = { abc }
L(« a suivi de x, y ou z, suivi de c ») = { axc, ayc, azc }
L(« une lettre suivie de lettres ou chiffres ») = { i, x2, poids, tk03, … }
• avec les expressions régulières :
/db_xref="taxon:10116" /mol_type="mRNA"
/organism="Rattus norvegicus" /strain="Sprague-Dawley"
/codon_start=1 /db_xref="GOA:P70597"
db_xref
mol_type
organism
page 2
page 3
Cours_6_4
s et E (ou E et s) se « correspondent » ou « collent » (match)
ou « AE reconnaît s »
© L. Tichit, 03/09/16
page 4
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Expression régulière : syntaxe
1.
Métacaractères
[…]
concaténation : si E et F sont des e.r. alors EF est une e.r. et
s  L(EF)  s = uv avec u  L(E) et v  L(F)
2. un caractère ordinaire c (cf. n° 3) est une e.r. et L(c) = { c }
ex. : 1+2  bonjour est une e.r. et L(bonjour) = { bonjour }
3. . ^ $ * + ? { } [ ] \ | ( ) caractères spéciaux (métacaractères)
ils ont un rôle comme opérateurs des expressions régulières
4.
•
ensemble de caractères
à l’intérieur : des caractères seuls ou des intervalles c1-c2
ex. : L( [0-9.] ) : un chiffre (0, 1, 2, …9) ou un point
L( [-+0-9.] ) : un signe, un chiffre ou un point
a l’intérieur de [] sont (seuls) spéciaux :
− entre deux caractères
^ au début
pour inhiber le rôle spécial d’un méta-caractère : le faire précéder de
\
\*bonjour\* est une e.r. et L(\*bonjour\*) = { *bonjour* }
pour indiquer un \ il faut mettre \\
Cours_6_4
© L. Tichit, 03/09/16
page 5
Expressions régulières - Exceptions
[^… ]
*
+
?
Cours_6_4
© L. Tichit, 03/09/16
page 6
Expressions régulières - Exceptions
Métacaractères
[…]
Cours_6_4
Métacaractères, suite
ensemble de caractères
à l’intérieur : des caractères seuls ou des intervalles c1-c2
ex. : L( [0-9.] ) : un chiffre (0, 1, 2, …9) ou un point
L( [-+0-9.] ) : un signe, un chiffre ou un point
complémentaire du précédent
.
{n}
ex. : L( [^0-9.] ) : tout caractère sauf un chiffre ou un point
répétition : E* correspond à un nombre quelconque (y compris 0)
de chaînes correspondant à E
ex. : L( ab*c ) = { ac, abc, abbc, abbbc, … }
répétition : E+ correspond à un nombre ≥ 1 de chaînes corr. à E
ex. : L( ab+c ) = { abc, abbc, abbbc, … }
facultatif : E? correspond à rien ou à une chaîne corr. à E
ex. : L( ab?c ) = { ac, abc }
© L. Tichit, 03/09/16
page 7
un caractère quelconque
ex. : L( a.*b ) = toute chaîne commençant par a, finissant par b
répétition exactement n fois
ex. : L( ab{5}c ) = { abbbbbc }
{n,m} répétition de n à m fois
ex. : L( ab{2,4}c ) = { abbc, abbbc, abbbbc }
disjonction
ex. : L( abcd|efgh ) = { abcd, efgh }
L( abc(d|e)fgh ) = { abcdfgh, abcefgh }
(…) en plus, définit un groupe (numéroté)
ex. : L( a(b(cd)e(fg)h)i ) = { abcdefghi }
|
bcdefgh
cd
fg
Cours_6_4
forment le groupe 1
forment le groupe 2
forment le groupe 3
© L. Tichit, 03/09/16
page 8
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Métacaractères, exemple
La malédiction de l’antislash
• expression régulière définissant un nombre flottant :
• les ingrédients (du désastre) :
 dans les e.r. les caractères spéciaux son inhibés par des \
 en Python on manipule les expressions régulières sous forme de
chaînes,
où les \ ont déjà rôle spécial (exemple : \n)
+123.456e-12
• ex. : écrire l’e.r. qui correspond à /a#b/, /a##b/, /a###b/, …
[-+]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?
/a#+b/
• écrire l’e.r. qui correspond à \a*b\, \a**b\, \a***b\, …
un signe facultatif des chiffres,
au moins un
un point des chiffres,
peut-être aucun
tout ceci facultativement
Cours_6_4
e ou E
signe (facultatif)
et chiffres
\\a\*+b\\
tout ceci facultativement
© L. Tichit, 03/09/16
page 9
Expressions régulières - Exceptions
Cours_6_4
© L. Tichit, 03/09/16
Expressions régulières - Exceptions
Utilisation des expressions régulières en Python
Utilisation des expressions régulières en Python
import re
import re
expRégComp = re.compile(expRég)
expRégComp = re.compile(expRég)
le début de chaîne colle-t-il
avec l’expression régulière ?
corresp = expRégComp.match(chaîne)
exemple :
corresp = expRégComp.search(chaîne, [ pos ] )
import re
expreg = re.compile(
"([-+]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?)")
...
utilisation de expreg
...
Cours_6_4
page 10
© L. Tichit, 03/09/16
page 11
trouver une sous-chaîne
[ à partir de pos ] qui colle
avec l’expression régulière
listeChaînes = expRégComp.findall(chaîne)
trouver toutes les sous-chaînes qui
collent avec l’expression régulière
Cours_6_4
© L. Tichit, 03/09/16
page 12
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Utilisation des expressions régulières en Python
Exemple
• Problème : obtenir
import re


expRégComp = re.compile(expRég)
… des lignes à ignorer …
corresp = expRégComp.match(chaîne)
corresp = expRégComp.search(chaîne)
listeChaînes = expRégComp.findall(chaîne)
si la correspondance n’existe pas, None
sinon, un objet caractérisant la correspondance, qu’on peut interroger
corresp.start()
corresp.end()
indice de début
indice (suivant) la fin
corresp.start( i )
corresp.end( i )
indice de début
indice (suivant) la fin
Cours_6_4
d’une correspondance
<data name="Flavobacterium species RFLI">
atgagtgaacgtctgagcattaccccgctggggccgtatatcggcgcacaaa
tttcgggtgccgacctgacgcgcccgttaagcgataatcagtttgaacagct
cgaattgttgatgtgagcgagaaagagagcgaagccttgttaagttttttgt
...
ttgcccatatcaccaaaccggagtttcaggtgcgctggcgctggcaaccaaa
tacctgccacagcgacggataatgcatcgggcgacgatccttggggataaac
cgttttatcgggcggggtaa
</data>
… des lignes à ignorer …
du ième groupe
© L. Tichit, 03/09/16
page 13
Cours_6_4
Exemple
page 14
Exemple
def lectureDonnees(nomFichier):
""" Lecture d’une chaîne ADN (cf. explications) """
def lectureDonnees(nomFichier):
""" Lecture d’une chaîne ADN (cf. explications) """
try:
fic = open(nomFichier, "r", encoding="iso-8859-15")
except IOError:
print(nomFichier, " : fichier inexistant")
return 1
...
© L. Tichit, 03/09/16
Expressions régulières - Exceptions
Expressions régulières - Exceptions
erdebut
erfin
la chaîne adn représentée dans un fichier entre deux balises,
un nom contenu dans la première balise :
... (le code de la page précédente) ...
while True:
ligne = fic.readline()
if len(ligne) == 0:
# le fichier est-il fini?
return 2
# si oui, on abandonne
res = erdebut.match(ligne)
if res != None:
break
nom = ligne[res.start(1): res.end(1)]
...
= re.compile('<data *name *= *"(.+)">')
= re.compile('</data>')
ces e.r. doivent reconnaître ceci
erdebut = re.compile('<data *name *= *"(.+)">')
<data name=
</data>
Cours_6_4
"Flavobacterium species RFLI">
© L. Tichit, 03/09/16
<data name= "Flavobacterium species RFLI">
page 15
Cours_6_4
© L. Tichit, 03/09/16
page 16
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Exemple
Exceptions
• toute erreur à l’exécution est signalée par le lancement d’une exception
def lectureDonnees(nomFichier):
""" Lecture d’une chaîne ADN (cf. explications) """
• les exceptions sont des instances de classes caractéristiques
(i.e. une exception est une donnée d’un type spécifique)
... (le code de la page précédente) ...
adn = ""
while True:
ligne = fic.readline()
if len(ligne) == 0:
return 3
res = erfin.match(ligne)
if res != None:
break
adn = adn + ligne[:-1]
• exemples :
# le fichier est-il fini?
# si oui, on abandonne
return nom, adn
on enlève le dernier caractère de la ligne,
qui est certainement \n
Cours_6_4
© L. Tichit, 03/09/16
page 17
Expressions régulières - Exceptions
Exception
ArithmeticError
ZeroDivisionError
FloatingPointError
OverflowError
KeyError
IndexError
EOFError
IOError
MemoryError
Cours_6_4
superclasse de toutes les exceptions
erreur arithmétique
division par zéro
erreur dans une opération flottante
le résultat d’une opération est trop grand
clé absente d’une table associative
indice hors de ses bornes
rencontre de la fin d’un fichier en lecture
erreur de fichier (souvent : fichier inexistant)
mémoire saturée (après tassage)
© L. Tichit, 03/09/16
page 18
Expressions régulières - Exceptions
Exceptions
Exceptions
• toute erreur à l’exécution est signalée par le lancement d’une exception
• toute erreur à l’exécution est signalée par le lancement d’une exception
• les exceptions sont des instances de classes caractéristiques
(i.e. une exception est une donnée d’un type spécifique)
• les exceptions sont des instances de classes caractéristiques
(i.e. une exception est une donnée d’un type spécifique)
• un programme peut intercepter et traiter les exceptions
lancées par une section de code donnée
• un programme peut intercepter et traiter les exceptions
lancées par une section de code donnée
try:
• les exceptions non interceptées arrêtent le programme. On le sait déjà :
...
code « surveillé »
...
>>> 3 / 0
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
3 / 0
ZeroDivisionError: division by zero
>>>
except TypeException:
...
code à exécuter si une TypeException a été lancée par le code surveillé
...
suite du programme
Cours_6_4
© L. Tichit, 03/09/16
page 19
Cours_6_4
© L. Tichit, 03/09/16
page 20
Expressions régulières - Exceptions
Expressions régulières - Exceptions
Exceptions
Exceptions
• toute erreur à l’exécution est signalée par le lancement d’une exception
• forme générale de la construction try :
• les exceptions sont des instances de classes caractéristiques
(i.e. une exception est une donnée d’un type spécifique)
try :
• un programme peut intercepter et traiter les exceptions
lancées par une section de code donnée
except TypeExceptionA :
...
code « surveillé »
...
...
• les exceptions non interceptées arrêtent le programme (on le sait déjà !)
• un programme peut lancer ses propres exceptions
(i.e. des situations normales peuvent être décrétés erronées) :
code à exécuter si une TypeExceptionA1 a été lancée par le code surveillé
...
except TypeExceptionB :
...
code à exécuter si une TypeExceptionB a été lancée par le code surveillé
...
raise TypeException
else:
...
code à exécuter si aucune une exception n’a été lancée par le code surveillé
...
finally:
...
code à exécuter dans tous les cas (libérer les ressources, fermer les fichiers, ...)
...
Cours_6_4
© L. Tichit, 03/09/16
page 21
Expressions régulières - Exceptions
Cours_6_4
© L. Tichit, 03/09/16
Expressions régulières - Exceptions
Exceptions
Exceptions et fichiers
• autre exemple : amélioration du précédent
• un fichier ouvert en mode "r" doit exister (sinon erreur)
• exemple :
def entierLu(invite, inf = None, sup = None):
""" Lecture d'un nombre en vérifiant sa bonne écriture
et le cas échéant son appartenance à un intervalle
"""


while True:
try:
x = int(input(invite))
if inf != None and x < inf or sup != None and x > sup:
raise ValueError
return x
x = entierLu("x ? ", sup = 100)
texte = fic.readlines()
fic.close()
return [ t[:-1] for t in texte ]
texte = lireLignes("monfichier.txt")
if texte != None:
for ligne in texte:
print(ligne)
x ? 150
Nombre mal écrit ou hors bornes – Redonnez
x ?
© L. Tichit, 03/09/16
lecture d’un fichier de texte
obtention du contenu sous forme de liste de lignes (sans les '\n' à la fin)
def lireLignes(nomFichier):
""" Lecture des lignes du fichier indiqué """
try:
fic = open(nomFichier, "r")
except IOError:
print nomFichier + " : ce fichier n’existe pas"
return None
except ValueError:
print("Nombre mal écrit ou hors bornes - Redonnez")
Cours_6_4
page 22
page 23
Cours_6_4
© L. Tichit, 03/09/16
page 24
Expressions régulières - Exceptions
Instruction assert
• syntaxe
assert expression1
assert expression1, expression2
si expression1 est vraie, rien ne se passe
sinon une exception est lancée (avec expression2 dans le libellé)
• exemple : une fonction qui requiert des arguments positifs :
def uneFonction(x, y):
assert x >= 0 and y >= 0, 'args incorrects'
suite de la fonction
...
Cours_6_4
© L. Tichit, 03/09/16
page 25

Documents pareils