Python – recherche des sous-chaînes avec des REGEXP

Dans l’un de vos scripts en Python vous voulez récupérer une sous-chaîne d’une variable qui répond à un modèle mais vous ne savez pas comment faire, ces quelques lignes devraient vous aider.

Lorsque l’on commence à travailler en python, on essaye de suivre plein de cours sur le net (developpez.com ou openclassroom.com) puis vient les premiers projets personnelles, un petit jeu, une petite interface, un developpement web et pourquoi pas un petit robot de scraping (extraire de contenu), d’ailleurs si l’on prend cet exemple il existe plein de bibliothèques le permettant mais ceci n’est pas interessant dans notre cas.

On pourrait très bien utilisé un script personnel qui le ferai et parfois très bien. En plus, cela vous donnera un peu d’expérience.

J’aurai pu utiliser une page web pour montrer la recherche des sous-chaines avec des REGEXP en python, mais je passerai par un exemple bien plus simple à comprendre (exemple pris dans le « hors-série de Linux Magasine n°86 »).

Nous allons utiliser cette variable :

series = 'Miss Fisher:Phrany Fisher;GOT:Daenerys Targaryen;X-Files:Dana Scully;Miss Fisher:Jack Robinson; Miss Fisher:Dorothy Williams;Got:Jon Snow;GOT:Tyrion Lannister;X-Files:Fox Mulder'

Une variable qui contient le nom d’une série suivi d’un personnage, chaque entrée est séparé par un point-virgule.

Une recherche par position serait très hasardeuse, il faudrait être sur de l’ordre des séries et personnages, de la longueur des noms etc. L’utilisation de REGEXP est donc indispensable, il suffira de déterminer un modèle récurrent dans l’affichage des données et de la retranscrire dans une expression régulière.

Notre modèle

Nous allons simplement rechercher les personnages de Game Of Thrones (GOT)

On peut voir que nous avons le nom de la série suivi de deux points puis le nom du personnage avec un point-virgule pour séparer les entrées ou pas de point-virgule dans le cas de la dernière entrée.

Pour retranscrire notre modèle en expression régulière, vous pouvez utiliser cette page qui est un petit mémo sur les expressions régulière : memo.

Nous obtenons ce schéma : SERIE:([a-zA-Z ]+)[;|$]

Petites explications

  • Dans notre cas série devra être remplacé par GOT
  • le contenu de notre première parenthèse signifie que nous recherchons des lettres en minuscule et/ou majuscule ainsi que des espaces (oui il y a un espace après le Z majuscule), le signe + indique qu’il y a au moins 1 caractère
  • le contenu des derniers corchets indique que soit le premier contenu est suivi d’un point-virgule ou bien qu’il s’agit de la fin de la variable

Le script python

Je mets directement le script nommé recherche_re.py :

import re

series = 'Miss Fisher:Phrany Fisher;GOT:Daenerys Targaryen;X-Files:Dana Scully;Miss Fisher:Jack Robinson; Miss Fisher:Dorothy Williams;Got:Jon Snow;GOT:Tyrion Lannister;X-Files:Fox Mulder'

pattern = r':([A-Za-z ]+)[;|$]'
resultat = re.findall(r'GOT'+pattern,series)

print(resultat)

Une des choses les plus importantes est l’utilisation de la bibliothèque re, qui contient une liste de classe utilisant les regexp avec python dont findall.

Nous retrouvons notre variable contenant les séries et personnage.

Notre modèle enfin pas tout à fait puis sur la 4eme ligne, notre classe qui signifie clairement, avec re, je cherche tout ce qui correspond à « GOT+pattern » (ou plutôt « GOT:([a-zA-Z ]+)[;|$]« )dans la variable series, le résultat est mis dans la variable resultat.

Puis on l’imprime (à l’écran).

Le résultat :

['Daenerys Targaryen','Jon Snow','Tyrion Lannister']

Voilà comment effectuer une recherche rapidement avec une expression régulière.

Aimez, partagez et commentez.

Laisser un commentaire