• Aucun résultat trouvé

Nous allons pour ce faire utiliser la fonction search du module re. Bien entendu, pour pouvoir l'utiliser, il faut l'importer. Code : Python Console

>>> import re

>>>

La fonction search attend deux paramètres obligatoires : l'expression régulière, sous la forme d'une chaîne, et la chaîne de caractères dans laquelle on recherche cette expression. Si l'expression est trouvée, la fonction renvoie un objet symbolisant l'expression recherchée. Sinon, elle renvoie None.

Certains caractères spéciaux dans nos expressions régulières sont modélisés par l'anti-slash \. Vous savez sans doute que Python représente d'autres caractères avec ce symbole. Si vous écrivez dans une chaîne \n, Python effectuera un saut de ligne !

Pour symboliser les caractères spéciaux dans les expressions régulières, il est nécessaire d'échapper l'anti-slash en le faisant précéder d'un autre anti-slash. Cela veut dire que pour écrire le caractère spécial \w, vous allez devoir écrire \\w.

C'est assez peu pratique et parfois gênant pour la lisibilité. C'est pourquoi je vous conseille d'utiliser un format de chaîne que nous n'avons pas vu jusqu'à présent : en plaçant un r avant le délimiteur qui ouvre notre chaîne, tous les caractères anti-slash qu'elle contient sont échappés.

Code : Python Console >>> r'\n'

'\\n' >>>

Si vous avez du mal à voir l'intérêt, je vous conseille simplement de vous rappeler de mettre un r avant d'écrire des chaînes contenant des expressions, comme vous allez le voir dans les exemples que je vais vous donner.

Mais revenons à notre fonction search. Nous allons mettre en pratique ce que nous avons vu précédemment : Code : Python Console

>>> re.search(r"abc", "abcdef")

<_sre.SRE_Match object at 0x00AC1640> >>> re.search(r"abc", "abacadaeaf") >>> re.search(r"abc*", "ab")

<_sre.SRE_Match object at 0x00AC1800> >>> re.search(r"abc*", "abccc")

<_sre.SRE_Match object at 0x00AC1640> >>> re.search(r"chat*", "chateau") <_sre.SRE_Match object at 0x00AC1800> >>>

Comme vous le voyez, si l'expression est trouvée dans la chaîne, un objet de la classe _sre.SRE_Match est renvoyé. Si l'expression n'est pas trouvée, la fonction renvoie None.

Cela fait qu'il est extrêmement facile de savoir si une expression est contenue dans une chaîne : Code : Python

if re.match(expression, chaine) is not None:

# Si l'expression est dans la chaîne # Ou alors, plus intuitivement

if re.match(expression, chaine):

N'hésitez pas à tester des syntaxes plus complexes et plus utiles. Tenez, par exemple, comment obliger l'utilisateur à saisir un numéro de téléphone ?

Avec le bref descriptif que je vous ai donné dans ce chapitre, vous pouvez théoriquement y arriver. Mais c'est quand même une regex assez complexe alors je vous la donne : prenez le temps de la décortiquer si vous le souhaitez.

Notre regex doit vérifier qu'une chaîne est un numéro de téléphone. L'utilisateur peut saisir un numéro de différentes façons :

0X XX XX XX XX

0X-XX-XX-XX-XX

0X.XX.XX.XX.XX

0XXXXXXXXX

Autrement dit :

le premier chiffre doit être un 0 ;

le second chiffre, ainsi que tous ceux qui suivent (9 en tout, sans compter le 0 d'origine) doivent être compris entre 0 et 9 ; tous les deux chiffres, on peut avoir un délimiteur optionnel (un tiret, un point ou un espace).

Voici la regex que je vous propose : Code : Autre

ARGH ! C'est illisible ton truc !

Je reconnais que c'est assez peu clair. Décomposons la formule :

D'abord, on trouve un caractère accent circonflexe ^ qui veut dire qu'on cherche l'expression au début de la chaîne. Vous pouvez aussi voir, à la fin de la regex, le symbole $ qui veut dire que l'expression doit être à la fin de la chaîne. Si

l'expression doit être au début et à la fin de la chaîne, cela signifie que la chaîne dans laquelle on recherche ne doit rien contenir d'autre que l'expression.

Nous avons ensuite le 0 qui veut simplement dire que le premier caractère de notre chaîne doit être un 0.

Nous avons ensuite une classe de caractère [0-9]. Cela signifie qu'après le 0, on doit trouver un chiffre compris entre 0 et 9 (peut-être 0, peut-être 1, peut-être 2…).

Ensuite, cela se complique. Vous avez une parenthèse qui matérialise le début d'un groupe. Dans ce groupe, nous trouvons, dans l'ordre :

D'abord une classe [ .-] qui veut dire « soit un espace, soit un point, soit un tiret ». Juste après cette classe, vous avez un signe ? qui signifie que cette classe est optionnelle.

Après la définition de notre délimiteur, nous trouvons une classe [0-9] qui signifie encore une fois « un chiffre entre 0 et 9 ». Après cette classe, entre accolades, vous pouvez voir le nombre de chiffres attendus (2).

Ce groupe, contenant un séparateur optionnel et deux chiffres, doit se retrouver quatre fois dans notre expression (après la parenthèse fermante, vous trouvez entre accolades le contrôle du nombre d'occurences).

Si vous regardez bien nos numéros de téléphone, vous vous rendez compte que notre regex s'applique aux différents cas présentés. La définition de notre numéro de téléphone n'est pas vraie pour tous les numéros. Cette regex est un exemple et même une base pour vous permettre de saisir le concept.

Si vous voulez que l'utilisateur saisisse un numéro de téléphone, voici le code auquel vous pourriez arriver : Code : Python

import re

chaine = ""

expression = r"^0[0-9]([ .-]?[0-9]{2}){4}$"

while re.search(expression, chaine) is None:

chaine = input("Saisissez un numéro de téléphone (valide) :")

Documents relatifs