• Aucun résultat trouvé

15.2 Module re et fonction search

15.2.4 Groupes

L’intérêt de l’objet de typeSRE_Match renvoyé par Python lorsqu’une expression régulière trouve une correspondance dans une chaîne de caractères est de pouvoir ensuite récupérer certaines zones précises : 

1 >>> regex = re.compile('([0-9]+)\.([0-9]+)')

 

Dans cet exemple, on recherche un nombre :

— qui débute par un ou plusieurs chiffres[0-9]+,

— suivi d’un point \. (le point a d’habitude une signification de métacaractère, donc il faut l’échapper avec\ pour qu’il retrouve sa signification de point),

— et qui se termine encore par un ou plusieurs chiffres[0-9]+.

Les parenthèses dans l’expression régulière permettent de créer des groupes ([0-9]+ deux fois) qui seront récupérés ultérieurement par la fonction group().



1 >>> resultat = regex.search("pi vaut 3.14") 2 >>> resultat.group(0) 3 '3.14' 4 >>> resultat.group(1) 5 '3' 6 >>> resultat.group(2) 7 '14' 8 >>> resultat.start() 9 8 10 >>> resultat.end() 11 12  

La totalité de la correspondance est donné par group(0), le premier élément entre parenthèse est donné pargroup(1) et le second par group(2).

Les fonctions start() et end() donnent respectivement la position de début et de fin de la zone qui correspond à l’expression régulière. Notez que la fonctionsearch() ne renvoie que la première zone qui correspond à l’expression régulière, même s’il en existe plusieurs :



1 >>> resultat = regex.search("pi vaut 3.14 et e vaut 2.72") 2 >>> resultat.group(0)

3 '3.14'

 

15.2.5 La fonction findall()

Pour récupérer chaque zone, vous pouvez utiliser la fonction findall() qui renvoie une liste des éléments en correspondance.

Chapitre 15. Expressions régulières et parsing 15.2. Module re et fonction search



1 >>> regex = re.compile('[0-9]+\.[0-9]+')

2 >>> resultat = regex.findall("pi vaut 3.14 et e vaut 2.72") 3 >>> resultat

4 ['3.14', '2.72']

 

L’utilisation des groupes entre parenthèse est également possible et ceux-ci sont automatiquement renvoyés sous la forme de tuples.



1 >>> regex = re.compile('([0-9]+)\.([0-9]+)')

2 >>> resultat = regex.findall("pi vaut 3.14 et e vaut 2.72") 3 >>> resultat

4 [('3', '14'), ('2', '72')]

 

15.2.6 La fonction sub()

Enfin, la fonction sub() permet d’effectuer des remplacements assez puissants. Par défaut la fonc- tion sub(chaine1,chaine2) remplace toutes les occurrences trouvées par l’expression régulière dans chaine2 par chaine1. Si vous souhaitez ne remplacer que les n premières occurrences, utilisez l’argu- mentcount=n :



1 >>> regex = re.compile('[0-9]+\.[0-9]+')

2 >>> regex.sub('quelque chose',"pi vaut 3.14 et e vaut 2.72") 3 'pi vaut quelque chose et e vaut quelque chose'

4 >>> regex.sub('quelque chose',"pi vaut 3.14 et e vaut 2.72", count=1) 5 'pi vaut quelque chose et e vaut 2.72'

 

Encore plus puissant, il est possible d’utiliser dans le remplacement des groupes qui ont été “capturés” avec des parenthèses.



1 >>> regex = re.compile('([0-9]+)\.([0-9]+)') 2 >>> phrase = "pi vaut 3.14 et e vaut 2.72" 3 >>> regex.sub("approximativement \\1",phrase)

4 'pi vaut approximativement 3 et e vaut vaut approximativement 2' 5 >>>

6 >>> regex.sub("approximativement \\1 (puis .\\2)",phrase)

7 'pi vaut approximativement 3 (puis .14) et e vaut approximativement 2 (puis .72)'

 

Si vous avez capturé des groupes, il suffit d’utiliser\\1, \\2 (etc) pour utiliser les groupes correspondants dans la chaîne substituée. On pourra noter que la syntaxe générale pour récupérer des groupes dans les outils qui gèrent les regex est \1, \2 (etc). Toutefois Python nous oblige à mettre un deuxième backslash car il y a ici deux niveaux : i) un premier niveau Python où on veut mettre un backslash littéral (donc\\), puis ii) un deuxième niveau regex dans lequel on veut retrouver \1. Si cela est confus, retenez seulement qu’il faut mettre un \\ devant le numéro de groupe.

Nous espérons que vous êtes convaincus de la puissance du module re et des expressions régulières, alors plus de temps à perdre, à vos regex !

15.3. Exercices Chapitre 15. Expressions régulières et parsing

15.3

Exercices

15.3.1 Regex de base

Dans ces exercices, nous allons utiliser le fichier genbank NC_001133.gbk3 correspondant au chromo- some I de la levure Saccharomyces Cerevisiae (souche S288C).

— Créer un scriptdef.py qui recherche le mot DEFINITION dans le fichier gbk, et ce en début de ligne. Le script affichera cette ligne (équivalent deegrep)

— Ecrire un scriptjournal.py qui affiche tous les journaux (mot-clé JOURNAL) dans lesquels ont été publié les travaux sur ce génome (bien sûr utiliser une regex !).

15.3.2 Nettoyeur d’espaces

Le fichier cigale_fourmi.txt4 contient le célèbre poème de Jean de la Fontaine. Malheureusement celui qui l’a recopié a parfois mis plusieurs espaces au lieu d’un seul entre les différents mots. Créer un script cigale_fourmi.py qui grâce aux regex et à la fonction sub() remplace les combinaisons de 2, 3, 4 (etc) espaces par un seul espace. Le nouveau texte “propre” sera enregistré dans un fichier cigale_fourmi_propre.txt.

15.3.3 Nettoyeur de doublons

Ecrire un script ote_doublons.py qui lit un fichier breves_doublons.txt5 et qui ôte tous les doublons de celui-ci à l’aide d’une regex. Le script affichera le nouveau texte à l’écran.

15.3.4 Compteur de gènes

— Télécharger un petit fichier gbk sur la genbank (vous pouvez réutiliser NC_001133.gbk). — Ecrire un scriptgenes.py qui affiche tous les mots gene dans le fichier gbk. Lancer ce script de

la manière suivante afin de voir ce que celui-ci renvoie page par page : 

1 $ python3 genes.py | less

 

Si on compte ces lignes est-ce une bonne méthode pour compter les gènes ? Comment selon vous peut-on récupérer une ligne unique par gène (bien observer le fichier genbank) ?

— Sur la base du script précédent, écrire un script compte_genes.py qui compte le nombre de gènes total et qui l’affiche à l’écran.

— Améliorer le script afin qu’il affiche en plus le nombre de gènes directs et le nombre de gènes complémentaires.

Dans le document Cours d’introduction à Python avec Rurple (Page 125-127)

Documents relatifs