Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
divers_expr_reg [Les recettes Python de Tyrtamos]

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
Dernière révision Les deux révisions suivantes
divers_expr_reg [2008/12/11 10:13]
tyrtamos
divers_expr_reg [2008/12/11 14:37]
tyrtamos
Ligne 22: Ligne 22:
 A noter que le motif trouve aussi un nombre entier très long (comme "5555555555555555555555" par exemple) qui n'est pas un "int" en Python, mais un "long". A noter que le motif trouve aussi un nombre entier très long (comme "5555555555555555555555" par exemple) qui n'est pas un "int" en Python, mais un "long".
  
-===== test d'un nombre réel (ou flottant ou "à virgule flottante") =====+===== test d'un nombre réel (ou flottantou à "virgule flottante")=====
  
 <code python> <code python>
-motif = r"^[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?$"+motif = r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$"
 </code> </code>
  
Ligne 31: Ligne 31:
  
 <code> <code>
-     -> on commence au début de la chaine +
-[+-]?     -> éventuellement un"+" ou un "-" +[+-]?     il peut y avoir ou pas un signe 
-[0-9]+     -un ou plusieurs chiffre(s+
-(\.[0-9]*)?  -> éventuellement un point, suivi éventuellement d'un ou plusieurs chiffres +([0-9]+[eE][+-]?[0-9]+)     si le 1er nb est entier (un ou plusieurs chiffres), alors, l'exposant est obligatoire 
-([eE][+-]?[0-9]+)?  -> éventuellement un exposant (un "e" ou un "E")suivi éventuellement d'un signe (+ ou -), suivi d'un ou plusieurs chiffres +| 
-  -> on termine à la fin de la chaine+([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)   si le 1er nombre (un ou plusieurs chiffre(s)) est suivi d'un point, alors les chiffres suivants et l'exposant sont optionnels  
 +
 +(\.[0-9]+([eE][+-]?[0-9]+)?) si on commence par un pointil y a un ou plusieurs chiffre(s) derrière, et l'exposant est optionnel 
 +) 
 +$
 </code> </code>
  
-NB: il peut ne pas y avoir de chiffre derrière le 1er point: en effetPython accepte un nombre tel que "1.au lieu de "1.0comme d'ailleurs la plupart des calculatrices de poche!+Bien sûrsi on veut chercher un tel nombre (entier ou réel) dans une chaine qui contient aussi autre chose, il faut retirer les "^et "$".
  
-NB: ce motif refuse un nombre réel qui commence par un point.+A noter qu'on peut faire plus court, (mais encore moins clair!) en remplaçant "[0-9]" par "\d", ce qui donne:
  
-Bien sûr, si on veut chercher un nombre réel dans une chaine qui contient aussi autre chose, il faut retirer les "^" et "$".+<code python> 
 +motif = r"^[+-]?((\d+[eE][+-]?\d+)|(\d+\.\d*([eE][+-]?\d+)?)|(\.\d+([eE][+-]?\d+)?))$" 
 +</code>
  
-On peut aussi vouloir trouver un nombre réel sans exposant. Il suffit de retirer la dernière partie du motif:+On pourrait aussi mettre le motif de l'exposant en facteur dans les 2 derniers cas, mais cela conduirait à ajouter des parenthèses imbriquées  
 + 
 +Vous pouvez essayer et éventuellement modifier l'expression régulière comme vous voulez avec la boucle suivante:
  
 <code python> <code python>
-motif = r"^[+-]?[0-9]+(\.[0-9]*)?$"+motif = r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$
 +while True: 
 +    x = raw_input("x = ").strip() 
 +    if x == "": 
 +        break 
 +    if re.match(motif, x): 
 +        print u"x est un réel" 
 +    else: 
 +        print u"x n'est pas un réel"
 </code> </code>
  
-Ou, au contraire, vouloir ne trouver que les nombres réels avec exposant: il suffit de supprimer le dernier "?":+ 
 +===== test d'un nombre quelconque (entier ou réel) ===== 
 + 
 +On peut simplement ajouter l'option supplémentaire "est entierà la précédente, ce qui devient:
  
 <code python> <code python>
-motif = r"^[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)$"+motif = r"^[+-]?(([0-9]+)|([0-9]+[eE][+-]?[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$"
 </code> </code>
 +
 +Et ce qui se lit:
 +
 +<code>
 +^
 +[+-]?     il peut y avoir ou pas un signe
 +(
 +([0-9]+)  ça pourrait être un nombre entier
 +|
 +([0-9]+[eE][+-]?[0-9]+)     il pourrait y avoir un nombre entier suivi d'un exposant
 +|
 +([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?  si le 1er nombre (un ou plusieurs chiffre(s)) est suivi d'un point, alors les chiffres suivants et l'exposant sont optionnels 
 +|
 +(\.[0-9]+([eE][+-]?[0-9]+)?) si on commence par un point, il y a un ou plusieurs chiffre(s) derrière, et l'exposant est optionnel
 +)
 +$
 +</code>
 +
 +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. 
  
  
divers_expr_reg.txt · Dernière modification: 2008/12/11 18:37 de tyrtamos