Outils pour utilisateurs

Outils du site


divers_expr_reg

Ceci est une ancienne révision du document !


Expressions régulières diverses

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 réel (ou flottant, ou à "virgule flottante")

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"

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:

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…

divers_expr_reg.1229000690.txt.gz · Dernière modification: 2008/12/11 14:04 de tyrtamos

Outils de la page