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