Outils pour utilisateurs

Outils du site


divers_expr_reg

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
divers_expr_reg [2008/12/11 14:04]
tyrtamos
divers_expr_reg [2008/12/11 18:37]
tyrtamos
Ligne 93: Ligne 93:
 </​code>​ </​code>​
  
-Il est bien sûr possible de simplifier les 2 premières options (qui deviennent: "​([0-9]+([eE][+-]?​[0-9]+)?​)"​), et comme l'exposant devient alors optionnel ​dans les 3 cas qui restent, on peut le mettre ​en facteurMais veillez ​à une chose: //**garder la lisibilité!**// Sauf cas particulieril est dommage de gagner quelques microsecondeset en contrepartie ​de ne plus comprendre ce qu'on fait...+Mais, en fait, l'​expression se simplifie, ce qui donne: 
 + 
 +<code python>​ 
 +motif = r"^[+-]?((([0-9]+(\.[0-9]*)?​)|(\.[0-9]+))([eE][+-]?​[0-9]+)?​)$" 
 +</​code>​ 
 + 
 +Sa lecture est plus complexe, et on peut mieux la comprendre avec l'indentation:​ 
 + 
 +<​code>​ 
 +
 +[+-]?   ​éventuellement un signe 
 +
 +    ( 
 +        ([0-9]+(\.[0-9]*)?​) ​ on commence par un chiffre, éventuellement suivi d'un point, lui-même éventuellement suivi d'un ou plusieurs chiffres ("​1."​ est accepté en tant que "​1.0"​) 
 +        | 
 +        (\.[0-9]+) ​   on commence par un point, suivi d'un ou plusieurs chiffre(s) ("​.1"​ est accepté en tant que "​0.1",​ mais, bien sûr, "​."​ est refusé) 
 +    ) 
 +    ([eE][+-]?​[0-9]+)? ​  ​et ​dans l'un ou l'​autre des 2 cas précédents, on peut avoir éventuellement un exposant  
 +
 +
 +</​code>​ 
 + 
 +L'​avantage d'​utiliser les expressions régulières est ici évidente:​ 
 + 
 +  * si je veux limiter mes nombres à des nombres entiers ou réels mais sans exposant, il suffit de supprimer ​le motif de l'​exposant 
 + 
 +  * si en plus je veux reconnaître des nombres écrits en français (avec la virgule), il suffit que je remplace le point par une virgule dans le motif 
 + 
 +\\ 
 +Et voilà une fonction qui, à partir d'une chaine, renvoie un entier, un entier long, un flottant ou False (d'​après une idée de eyquem: [[http://www.developpez.net/forums/d656901/​autres-langages/​python-zope/​general-python/​verifier-entree-nombre/​]]). 
 + 
 +<code python>​ 
 +def numbereval(x):​ 
 +    if re.match(r"​^[+-]?​[0-9]+[lL]?​$"​x): 
 +        if x!=""​ and x[-1] in "​lL":​ 
 +            return long(x[:​-1]) 
 +        else: 
 +            return int(x) 
 +    elif re.match(r"​^[+-]?​(([0-9]+[eE][+-]?​[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?​[0-9]+)?​)|(\.[0-9]+([eE][+-]?​[0-9]+)?​))$"​x): 
 +        return float(x) 
 +    else: 
 +        return False 
 +</​code>​ 
 + 
 +Cette fonction détecte un entier long de 2 façon différentes:​ 
 + 
 +  * si l'​entier est tellement long qu'il déborde le "​int"​ (exemple: "​55555555555555555555"​). 
 + 
 +  * si l'​entier est donné avec un "​l"​ ou un "​L"​ à la fin (exemple: "​12L"​). 
 + 
 +Et voilà le code pour le tester: 
 + 
 +<code python>​ 
 +while True: 
 +    y = numbereval(raw_input('​x =').strip()) 
 +    if y: 
 +        print type(y), y 
 +    else: 
 +        print u"ce n'est pas un nombre"​ 
 +</​code>​ 
 + 
 +\\ 
 +Amusez-vous bien! 
  
 <​html>​ <​html>​
divers_expr_reg.txt · Dernière modification: 2008/12/11 18:37 par tyrtamos