Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
divers_expr_reg [2008/12/11 13:17] tyrtamos |
divers_expr_reg [2008/12/11 18:37] (Version actuelle) tyrtamos |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Expressions régulières diverses ====== | ====== Expressions régulières diverses ====== | ||
- | |||
- | //**En construction!**// | ||
- | |||
Vous trouverez ici quelques expressions régulières avec leur " | Vous trouverez ici quelques expressions régulières avec leur " | ||
Ligne 25: | Ligne 22: | ||
A noter que le motif trouve aussi un nombre entier très long (comme " | A noter que le motif trouve aussi un nombre entier très long (comme " | ||
- | ===== test d'un nombre | + | ===== test d'un nombre réel (ou flottant, ou à " |
<code python> | <code python> | ||
- | motif = r" | + | motif = r" |
</ | </ | ||
Ligne 34: | Ligne 31: | ||
< | < | ||
- | ^ -> on commence au début de la chaine | + | ^ |
- | [+-]? -> éventuellement un" | + | [+-]? il peut y avoir ou pas un signe |
- | [0-9]+ | + | ( |
- | (\.[0-9]*)? -> éventuellement un point, suivi éventuellement d'un ou plusieurs chiffres | + | ([0-9]+[eE][+-]? |
- | ([eE][+-]? | + | | |
- | $ -> on termine à la fin de la chaine | + | ([0-9]+\.[0-9]*([eE][+-]? |
+ | | | ||
+ | (\.[0-9]+([eE][+-]? | ||
+ | ) | ||
+ | $ | ||
</ | </ | ||
- | |||
- | 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 " | 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 " | ||
- | ===== test d'un nombre réel (ou "flottant" | + | A noter qu'on peut faire plus court, |
- | 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. | + | <code python> |
+ | motif = r" | ||
+ | </ | ||
- | Par exemple: | + | On pourrait aussi mettre le motif de l' |
- | * acceptable: " | + | Vous pouvez essayer et éventuellement modifier l' |
- | | + | <code python> |
+ | motif = r" | ||
+ | while True: | ||
+ | x = raw_input("x = ").strip() | ||
+ | if x == "" | ||
+ | break | ||
+ | if re.match(motif, | ||
+ | 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) ===== | ||
- | Ce qui donne l'expression régulière suivante: | + | On peut simplement ajouter |
<code python> | <code python> | ||
- | r" | + | motif = r" |
</ | </ | ||
- | Et voilà comment elle se lit: | + | Et ce qui se lit: |
< | < | ||
- | ^ -> début de la chaine | + | ^ |
- | [+-]? -> éventuellement | + | [+-]? il peut y avoir ou pas un signe |
- | ( -> début de bloc qui décrit tout ce qui peut suivre l'éventuel signe | + | ( |
- | ([0-9]+[eE][+-]? | + | ([0-9]+) ça pourrait être un nombre entier |
- | | -> ou: | + | | |
+ | ([0-9]+[eE][+-]? | ||
+ | | | ||
+ | ([0-9]+\.[0-9]*([eE][+-]? | ||
+ | | | ||
+ | (\.[0-9]+([eE][+-]? | ||
+ | ) | ||
+ | $ | ||
+ | </ | ||
+ | |||
+ | Mais, en fait, l' | ||
+ | |||
+ | <code python> | ||
+ | motif = r" | ||
+ | </ | ||
+ | |||
+ | Sa lecture est plus complexe, et on peut mieux la comprendre avec l' | ||
+ | |||
+ | < | ||
+ | ^ | ||
+ | [+-]? | ||
+ | ( | ||
( | ( | ||
- | | + | ([0-9]+(\.[0-9]*)?) on commence par un chiffre, éventuellement |
- | | + | | |
- | | | + | (\.[0-9]+) |
- | (\.[0-9]+) | + | |
- | ) | + | |
- | ([eE][+-]?[0-9]+)? -> les 2 solutions précédentes peuvent être suivies ou non d'un exposant | + | |
) | ) | ||
- | ) -> fin de bloc | + | ([eE][+-]? |
- | $ -> fin de la chaine | + | ) |
+ | $ | ||
</ | </ | ||
- | Vous pouvez essayer et éventuellement modifier | + | L' |
+ | |||
+ | * 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. | ||
+ | |||
+ | \\ | ||
+ | Et voilà une fonction qui, à partir d'une chaine, renvoie un entier, un entier long, un flottant ou False (d' | ||
+ | |||
+ | <code python> | ||
+ | def numbereval(x): | ||
+ | if re.match(r" | ||
+ | if x!="" | ||
+ | return long(x[: | ||
+ | else: | ||
+ | return int(x) | ||
+ | elif re.match(r" | ||
+ | return float(x) | ||
+ | else: | ||
+ | return False | ||
+ | </ | ||
+ | |||
+ | Cette fonction détecte un entier long de 2 façon différentes: | ||
+ | |||
+ | * si l' | ||
+ | |||
+ | * si l' | ||
+ | |||
+ | Et voilà le code pour le tester: | ||
<code python> | <code python> | ||
- | motiffloat = r" | ||
- | |||
while True: | while True: | ||
- | | + | |
- | if x == "" | + | if y: |
- | | + | |
- | if re.match(motiffloat, x): | + | |
- | print u"x est un réel" | + | |
else: | else: | ||
- | print u"x n'est pas un réel" | + | print u"ce n'est pas un nombre" |
</ | </ | ||
+ | \\ | ||
+ | Amusez-vous bien! | ||