• Aucun résultat trouvé

Pour terminer : la PEP 20

La PEP 20 est une sorte de réflexion philosophique avec des phrases simples qui devraient guider tout programmeur. Comme les développeurs de Python ne manque pas d’humour, celle-ci est accessible sous la forme d’un « œuf de Pâques » (easter egg en anglais) ou encore « fonctionnalité cachée d’un programme » en important un module nomméthis :

10.https://fr.wikipedia.org/wiki/Test_unitaire 11.https://choosealicense.com/

15.6. Pour terminer : la PEP 20 Chapitre 15. Bonnes pratiques en programmation Python

1 >>> import this

2 The Zen of Python , by Tim Peters 3

4 Beautiful is better than ugly . 5 Explicit is better than implicit . 6 Simple is better than complex . 7 Complex is better than complicated . 8 Flat is better than nested .

9 Sparse is better than dense . 10 Readability counts .

11 Special cases aren 't special enough to break the rules . 12 Although practicality beats purity .

13 Errors should never pass silently . 14 Unless explicitly silenced .

15 In the face of ambiguity , refuse the temptation to guess .

16 There should be one -- and preferably only one -- obvious way to do it. 17 Although that way may not be obvious at first unless you 're Dutch . 18 Now is better than never .

19 Although never is often better than * right * now .

20 If the implementation is hard to explain , it 's a bad idea . 21 If the implementation is easy to explain , it may be a good idea . 22 Namespaces are one honking great idea -- let 's do more of those ! 23 >>>

Et si l’aventure et les easter eggs vous plaisent, testez également la commande

1 >>> import antigravity

Il vous faudra un navigateur et une connexion internet.

Pour aller plus loin

— L’article Python Code Quality : Tools & Best Practices12 du site Real Python est une ressource intéressante pour explorer plus en détail la notion de qualité pour un code Python. De nombreux linters y sont présentés.

— Les articles Assimilez les bonnes pratiques de la PEP 813du site OpenClassrooms et Structuring Python Programs14 du site Real Python rappellent les règles d’écriture et les bonnes pratiques vues dans ce chapitre.

12.https://realpython.com/python-code-quality/

13.https://openclassrooms.com/fr/courses/4425111-perfectionnez-vous-en-python/4464230-assimilez-les-bonnes-pratiques-de-la-pep-8 14.https://realpython.com/python-program-structure/

Chapitre 16

Expressions régulières et parsing

Le module re permet d’utiliser des expressions régulières avec Python. Les expressions régulières sont aussi appelées en anglais regular expressions ou en plus court regex. Dans la suite de ce chapitre, nous utiliserons souvent le mot regex pour désigner une expression régulière. Les expressions régulières sont puissantes et incontournables en bioinformatique, spécialement lorsque vous souhaitez récupérer des informations dans de gros fichiers.

Cette action de recherche de données dans un fichier est appelée plus généralement parsing (qui signifie littéralement « analyse syntaxique »). Le parsing fait partie du travail quotidien du bioinformaticien, il est sans arrêt en train de « fouiller » dans des fichiers pour en extraire des informations d’intérêt comme par exemple récupérer les coordonnées 3D des atomes d’une protéine dans un fichier PDB ou encore extraire les gènes d’un fichier GenBank.

Dans ce chapitre, nous ne ferons que quelques rappels sur les expressions régulières. Pour une documentation plus com-plète, référez-vous à la page d’aide des expressions régulières1sur le site officiel de Python.

16.1 Définition et syntaxe

Une expression régulière est une suite de caractères qui a pour but de décrire un fragment de texte. Cette suite de caractères est encore appelée motif (en anglais pattern), motif qui est constitué de deux types de caractères :

— Les caractères dits normaux.

— Les métacaractères ayant une signification particulière, par exemple le caractèreˆ signifie début de ligne et non pas le caractère « chapeau » littéral.

Avant de présenter les regex en Python, nous allons faire un petit détour par Unix. En effet, certains programmes comme egrep, sed ou encore awk savent interpréter les expressions régulières. Tous ces programmes fonctionnent généralement selon le schéma suivant :

— Le programme lit un fichier ligne par ligne.

— Pour chaque ligne lue, si l’expression régulière passée en argument est retrouvée dans la ligne, alors le programme effectue une action.

Par exemple, pour le programmeegrep :

1 $ egrep "^ DEF " herp_virus . gbk

2 DEFINITION Human herpesvirus 2, complete genome .

Ici, egrep affiche toutes les lignes du fichier du virus de l’herpès (herp_virus.gbk) dans lesquelles la regex ˆDEF (c’est-à-dire le motDEF en début de ligne) est retrouvée.

Remarque

Il est intéressant de faire une point sur le vocabulaire utilisé en anglais et en français. En général, on utilise le verbe to matchpour indiquer qu’une regex « a fonctionné ». Bien qu’il n’y ait pas de traduction littérale en français, on peut utiliser les verbes « retrouver » ou « correspondre ». Par exemple, on pourra traduire l’expression « The regex matches the line » par « La regex est retrouvée dans la ligne » ou encore « La regex correspond dans la ligne ».

Après avoir introduit le vocabulaire des regex, voici quelques éléments de syntaxe des métacaractères :

16.1. Définition et syntaxe Chapitre 16. Expressions régulières et parsing

ˆ Début de chaîne de caractères ou de ligne.

Exemple : la regexˆATG est retrouvée dans la chaîne de caractères ATGCGT mais pas dans la chaîne CCATGTT.

$ Fin de chaîne de caractères ou de ligne.

Exemple : la regexATG$ est retrouvée dans la chaîne de caractères TGCATG mais pas dans la chaîne CCATGTT.

. N’importe quel caractère (mais un caractère quand même).

Exemple : la regexA.G est retrouvée dans ATG, AtG, A4G, mais aussi dans A-G ou dans A G.

[ABC] Le caractère A ou B ou C (un seul caractère).

Exemple : la regexT[ABC]G est retrouvée dans TAG, TBG ou TCG, mais pas dans TG.

[A-Z] N’importe quelle lettre majuscule.

Exemple : la regexC[A-Z]T est retrouvée dans CAT, CBT, CCT. . .

[a-z] N’importe quelle lettre minuscule. [0-9] N’importe quel chiffre.

[A-Za-z0-9] N’importe quel caractère alphanumérique. [ˆAB] N’importe quel caractère sauf A et B.

Exemple : la regexCG[ˆAB]T est retrouvée dans CG9T, CGCT. . . mais pas dans CGAT ni dans CGBT.

\ Caractère d’échappement (pour protéger certains caractères).

Exemple : la regex\+ désigne le caractère + littéral. La regex A\.G est retrouvée dans A.G et non pas dans A suivi de n’importe quel caractère, suivi deG.

* 0 à n fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(CG)*T est retrouvée dans AT, ACGT, ACGCGT. . .

+ 1 à n fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(CG)+T est retrouvée dans ACGT, ACGCGT. . . mais pas dans AT.

? 0 à 1 fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(CG)?T est retrouvée dans AT ou ACGT.

{n} n fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(CG){2}T est retrouvée dans ACGCGT mais pas dans ACGT, ACGCGCGT ou ACGCG.

{n,m} n à m fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(C){2,4}T est retrouvée dans ACCT, ACCCT et ACCCCT mais pas dans ACT, ACCCCCT ou ACCC.

{n,} Au moins n fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(C){2,}T est retrouvée dans ACCT, ACCCT et ACCCCT mais pas à ACT ou ACCC.

{,m} Au plus m fois le caractère précédent ou l’expression entre parenthèses précédente.

Exemple : la regexA(C){,2}T est retrouvée dans AT, ACT et ACCT mais pas dans ACCCT ou ACC.

(CG|TT) Les chaînes de caractèresCG ou TT.

Exemple : la regexA(CG|TT)C est retrouvée dans ACGC ou ATTC.

Enfin, il existe des caractères spéciaux qui sont bien commodes et qui peuvent être utilisés en tant que métacaractères :

\d remplace n’importe quel chiffre (d signifie digit), équivalent à[0-9].

\w remplace n’importe quel caractère alphanumérique et le caractère souligné (underscore) (w signifie word character),

équivalent à[0-9A-Za-z_].

\s remplace n’importe quel « espace blanc » (whitespace) (s signifie space), équivalent à [ \t\n\r\f]. La notion d’espace blanc a été abordée dans le chapitre 10 Plus sur les chaînes de caractères. Les espaces blancs les plus classiques sont l’espace , la tabulation\t, le retour à la ligne \n, mais il en existe d’autres comme \r et \f que nous ne développerons pas ici.\s est très pratique pour détecter une combinaison d’espace(s) et/ou de tabulation(s). Comme vous le constatez, les métacaractères sont nombreux et leur signification est parfois difficile à maîtriser. Faites particulièrement attention aux métacaractères., + et * qui, combinés ensemble, peuvent donner des résultats ambigus.

Il est important de savoir par ailleurs que les regex sont « avides » (greedy en anglais) lorsqu’on utilise les métacaractères + et *. C’est-à-dire que la regex cherchera à « s’étendre » au maximum. Par exemple, si on utilise la regex A+ pour faire une recherche dans la chaîneTTTAAAAAAAAGC, tous les A de cette chaîne (8 en tout) seront concernés, bien que AA, AAA, etc. « fonctionnent » également avec cette regex.