Outils pour utilisateurs

Outils du site


divers_expr_reg

Ceci est une ancienne révision du document !


Expressions régulières diverses

En construction!

Vous trouverez ici quelques expressions régulières avec leur “décodage” en langage humain (et ce n'est pas du luxe :-D).

test d'un nombre entier

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”.

test d'un nombre entier ou réel

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 “$”.

test d'un nombre réel (ou "flottant" ou à "virgule flottante")

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:

  • acceptable: “+11.111” “1.” “.1” “1e5” “1.e5” “.1e5”
  • refusé: “1” (=c'est un entier) “.” “.e5” “e5”

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"

divers_expr_reg.1228997860.txt.gz · Dernière modification: 2008/12/11 13:17 de tyrtamos

Outils de la page