Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Compilation d'une expression régulière

Une expression régulière permet notamment de vérifier qu'une chaîne de caractères correspond bien à un motif donné (un format d'email, par exemple). Mais attention, pour être opérationnelle, une expression régulière doit être transformée en une machine à états (state machine, en anglais). Cette transformation (on parle aussi de compilation d'expression régulière) n'est pas instantanée : si vous devez utiliser une expression régulière plus qu'une fois, il est vivement conseillé de la compiler une fois pour toute via la fonction re.compile.

la fonction re.match recompile l'expression régulière à chaque appel. Il est donc conseillé de l'utiliser que pour une utilisation unique d'une expression régulière.

Exemple de code

L'exemple de code suivant teste plusieurs utilisations de la fonction re.match (un seul appel aurait été trop rapide) est affiche le temps passé. Ensuite, il procède à un test équivalent basé sur la fonction re.compile et sur l'utilisation de la machine à état ainsi produite. Les résultats sont sans appel : grâce à la compilation de l'expression régulière, on réduit par deux le temps d'exécution !

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
#!/usr/bin/python3
# -*- coding: utf-8 -*- 

import re
import time

loop = 10000000
email = "name@societe.com"
email_re = r"^[\w.-]+@[\w.-]+\.[a-z]{2,}$"

# On test plusieurs fois l'expression régulière sans la compiler.
begin = time.time()
for loop in range( loop ):
    assert re.match( email_re, email )
end = time.time()
print( "Without compilation - Duration %d secs" % int(end - begin) )

email_compiled = re.compile( email_re )

# On test plusieurs fois l'expression régulière aprés l'avoir compilée. 
begin = time.time()
for loop in range( loop ):
    assert email_compiled.match( email )
end = time.time()
print( "With compilation - Duration %d secs" % int(end - begin) )
Fichie compilation.py : exemple de compilation d'une expression régulière

Et voici les résultats produits par cet exemple (les temps sont, bien entendu, dépendants de votre puissance de calcul) :

$> python3 compilation.py
Without compilation - Duration 11 secs
With compilation - Duration 5 secs
$>