Ceci est une ancienne révision du document !
En construction!
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]+(\.[0-9]*)?([eE][+-]?[0-9]+)?$"
avec:
^ -> on commence au début de la chaine [+-]? -> éventuellement un"+" ou un "-" [0-9]+ -> un ou plusieurs chiffre(s) (\.[0-9]*)? -> éventuellement un point, suivi éventuellement d'un ou plusieurs chiffres ([eE][+-]?[0-9]+)? -> éventuellement un exposant ("e" ou "E"), éventuellement un signe (+ ou -), suivi d'un ou plusieurs chiffres (si il y a un exposant, il y a forcément au moins un chiffre) $ -> on termine à la fin de la chaine
NB: ce motif refuse un nombre réel qui commence par un point.
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 “$”.
Pour avoir une solution plus complète, il faut bien sûr être clair sur ce qu'on veut accepter et sur ce qu'on veut refuser.
Par exemple:
Ce qui donne l'expression régulière suivante:
r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|((([0-9]+\.[0-9]*)|(\.[0-9]+))([eE][+-]?[0-9]+)?))$"
Et voilà comment elle se lit:
^ -> début de la chaine [+-]? -> éventuellement un signe (+ ou -) ( -> début de bloc qui décrit tout ce qui peut suivre l'éventuel signe ([0-9]+[eE][+-]?[0-9]+) -> si le 1er nombre est entier, il est forcément suivi d'un exposant | -> ou: ( ( ([0-9]+\.[0-9]*) -> soit j'ai un ou plusieurs chiffre(s) suivi d'un point et éventuellement de chiffres (comme: 12. ou 12.35) | (\.[0-9]+) -> soit j'ai un point suivi d'un ou plusieurs chiffre(s) (comme .5) ) ([eE][+-]?[0-9]+)? -> les 2 solutions précédentes peuvent être suivies ou non d'un exposant ) ) -> fin de bloc $ -> fin de la chaine
Vous pouvez essayer et éventuellement modifier l'expression régulière comme vous voulez avec la boucle suivant:
motiffloat = r"^[+-]?(([0-9]+[eE][+-]?[0-9]+)|((([0-9]+\.[0-9]*)|(\.[0-9]+))([eE][+-]?[0-9]+)?))$" print while True: x = raw_input("x = ").strip() if x == "": break if re.match(motiffloat, x): print u"x est un réel" else: print u"x n'est pas un réel"