Ceci est une ancienne révision du document !
Vous trouverez ici quelques expressions régulières avec leur “décodage” en langage humain (et ce n'est pas du luxe ).
motif = r"^[+-]?[0-9]+$"
avec:
^ -> on commence au début de la chaine [+-]? -> éventuellement un"+" ou un "-" [0-9]+ -> un ou plusieurs chiffre(s) $ -> on termine à la fin de la chaine
Bien sûr, si on veut chercher un entier dans une chaine qui contient aussi autre chose, il faut retirer les “^” et “$”.
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”.
motif = r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$"
avec:
^ [+-]? il peut y avoir ou pas un signe ( ([0-9]+[eE][+-]?[0-9]+) si le 1er nb est entier (un ou plusieurs chiffres), alors, l'exposant est obligatoire | ([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 ) $
Bien sûr, si on veut chercher un tel nombre (entier ou réel) dans une chaine qui contient aussi autre chose, il faut retirer les “^” et “$”.
A noter qu'on peut faire plus court, (mais encore moins clair!) en remplaçant “[0-9]” par “\d”, ce qui donne:
motif = r"^[+-]?((\d+[eE][+-]?\d+)|(\d+\.\d*([eE][+-]?\d+)?)|(\.\d+([eE][+-]?\d+)?))$"
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:
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"
On peut simplement ajouter l'option supplémentaire “est entier” à la précédente, ce qui devient:
motif = r"^[+-]?(([0-9]+)|([0-9]+[eE][+-]?[0-9]+)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)|(\.[0-9]+([eE][+-]?[0-9]+)?))$"
Et ce qui se lit:
^ [+-]? 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 ) $
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 facteur. Mais veillez à une chose: garder la lisibilité! Sauf cas particulier, il est dommage de gagner quelques microsecondes, et en contrepartie de ne plus comprendre ce qu'on fait…