Les expressions régulières dans Qualigéo

Dans Qualigéo le test données se fait avec la bibliothèque re en python2.7 (https://docs.python.org/2/library/re.html)

Une expression régulière est une chaîne de caractères appelée parfois motif (pattern en anglais) qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise pour la trouver dans un bloc de texte et éventuellement lui appliquer un traitement automatisé comme un ajout, un remplacement ou une suppression. Elles permettent l’édition et le contrôle de texte ainsi que la manipulation de langages informatiques.

Les mécanismes de base pour former de telles expressions sont basés sur des caractères spéciaux de regroupement, de quantification et de substitution :


Les opérateurs standards

  • Une barre verticale | est l’opérateur de choix, il sépare plusieurs expressions alternatives, il peut donc être combiné autant de fois que nécessaire. C’est donc le symbole "OU" . Par exemple : numero|num|numéro, signifie que l’on recherche soit le mot "numero" soit le mot "num", soit le mot "numéro".

  • L’accent circonflexe ^ indique le début d’une chaîne. ^num représente le mot "num" en début de ligne.

  • Le dollar $ indique la fin d’une chaîne : ^num$ représente alors le mot "num" sur une seule ligne.


Les classes de caractères

Une classe de caractères se placent entre crochets [] : un des éléments à l’intérieur des crochets convient. Une classe de caractère fait donc correspondre un seul des caractères compris dans les crochets.

Par exemple, [nm] trouve dans le mot numéro "n" ou "m".


Les intervalles de classes

  • Le tiret - autorise une plage de caractères. Ainsi [a-z] autorise n’importe quelle lettre de a à z. [0-9] autorise un chiffre entre 0 et 9. [1-8] correspond à un chiffre entre 1 et 8.

  • L’accent circonflexe au début d’une intervalle de classe [^ ] permet d’exclure un caractère en début de classe . Par exemple [^0-9] signifie que la chaîne comporte un caractère qui n’est pas un chiffre.


Les quantificateurs

Les quantificateurs permettent de spécifier le nombre de fois que peut se répéter un caractère ou une suite de caractères.

? indique que le caractère qui le précède est facultatif, il peut donc être présent 0 ou 1 fois.

+indique que le caractère qui le précède est obligatoire , il peut donc être présent 1 ou plusieurs fois

* indique que la caractère qui le précède est facultatif et qu’il peut être présent 0, 1 ou plusieurs fois.

Pour indiquer que les quantificateurs sont relatifs à plusieurs caractères et non pas au seul caractère le précédent, il faut placer ces derniers entre parenthèses ().


Les quantificateurs bornés

Les accolades {} permettent de spécifier des quantificateurs bornés et spécifier ainsi le nombre de fois qu’un caractère ou groupe de caractères se répètent.

Le quantificateur borné permet de faire correspondre exactement de m à n occurrences de ce qui précède, m et n étant deux entiers tels que m < n. Si le premier caractère m est omis, alors il prend la valeur par défaut 0. Si le deuxième caractère est omis mais que la virgule est présente, il est considéré comme infini. Enfin si le deuxième caractère et la virgule sont omis, alors il prend la valeur du premier caractère m.

Ainsi, {2} indique que le caractère ou groupe de caractères se répètent 2 fois.

{3,5} indique que le caractère ou groupe de caractères se répètent 3 à 5 fois.

{3,} indique que le caractère ou groupe de caractères se répètent au minimum 3 fois et ce jusqu’à l’infini.

Donc, le quantificateur ? correspond à écrire {0,1}

Le quantificateur + correspond à écrire {1,}

Le quantificateur * correspond à écrire {0,}


Les séquences d’échappement

Les caractères **.()[]+?$|?* sont utilisés par les expressions régulières pour spécifier les chaînes de caractères à apparier, mais, ils doivent aussi pouvoir désigner littéralement le caractère correspondant. Pour cela, il faut les "échappés" par des séquences d’échappement. Ceci se fait en les précédant d’un </span>.

Au sein d’une classe de caractères, le caractère d’échappement n’est pas nécessaire. La recherche du caractère - doit alors être spécifié en début ou fin de la classe pour ne pas être confondu avec une intervalle de classe.


Les classes abrégées (POSIX)**

Les classes abrégées correspondent à des raccourcis, pour simplifier la rédaction des expressions.

  • . correspond à un caractère unique quelconque. Ainsi c.r trouve une correspondance dans "carte", décor", "chrétien"...

  • \t correspond à une tabulation

  • \n correspond à un retour à la ligne

  • \w correspond à une lettre non accentuée ou à un chiffre et équivaut à [a-zA-Z0-9_

  • \W correspond à ni une lettre ni un chiffre ( équivaut à ([^0-9a-zA-Z])

  • \d correspond à un chiffre et est équivalent à [0-9]

  • \D indique ce qui n’est pas un chiffre, cela revient à écrire [^0-9]

  • \s indique un espace blanc


Exemples d’expressions régulières**

  • Entier positif : ^[0-9]+$ (Tout chiffre de 0 à 9 qui peut se répéter à l’infini).

  • Entier négatif : ^-[0-9]+$ ("-" suivi de n’importe quel chiffre de 0 à 9 qui peut se répéter à l’infini).

  • Code postal français métropolitains + Dom Tom :

^(2[AB]|(0[1-9])|[1-8][0-9]|9[0-5]|97|98)[0-9]{3}$

(
(2[AB] |==> 2A ou 2B ou      
0[1-9] |==> de 01 à 09 ou
[1-8][0-9] |==> de 10 à 89 ou
9[0-5]| ==> de 90 à 95 ou
97) ==> 97 ou
98 ==> 98
)

[0-9]{3}==> de 000 à 999.
  • Code INSEE :

^(2[AB]|(0[1-9])|[1-8][0-9]|9[0-5]|97|98)(00[1-9]|0[1-9][0-9]|[1-9][0-9][0-9])$

(
(2[AB] |==> 2A ou 2B ou
0[1-9] |==> de 01 à 09 ou
[1-8][0-9] |==> de 10 à 89 ou
9[0-5]| ==> de 90 à 95 ou
97) ==> 97 ou
98 ==> 98
)

(00[1-9]| ==> de 001 à 009 ou
0[1-9][0-9]|==> de 010 à 099 ou
[1-9][0-9][0-9]) ==> de 100à 999.
  • Chiffre décimal avec deux chiffres après la virgule :

    ^([0-9])+(,[0-9]{2})$
    
  • Date au format jj/mm/aaaa :

    (0[1-9]|[1-2][0-9]|30|31)/(0[1-9]|1[0-2])/[0-9]{4}
    
  • Date au format aaaa-mm-jj :

    [0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|30|31)
    
  • Adresse E-mail :

    ^[a-zA-Z0-9][-._a-zAZ09]*@[a-zA-Z0-9]*\.[a-zA-Z]{2}$
    
  • Numéro de téléphone français

    ^0[1-9]([-./ ]?[0-9]{2}){4}$