IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Utiliser une regex sur un raw_input


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut Utiliser une regex sur un raw_input
    Bonjour, je suis en train de créer un programme ou l'utilisateur doit rentrer une suite de 8 chiffres. J'aimerais bien contrôler que les caractères rentrés soient bien tous des chiffres et non des lettres. je pense que c'est possible avec les regex et le module re (je pense à la classe [0-9], ou \d). J'ai regardé plusieurs tutos sur les regex et python, ils mentionnent bien cette classe mais je n'ai pas vu comment l'utiliser sur un raw_input.

    Avez-vous la solution? Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    tu peux aussi faire un int() ou un float() du résultat de raw_input(), c'est plus léger qu'une regex.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Oui c'est ce que je fais, mais ce n'est pas vraiment ce que je veux. Le programme va arréter de s'éxécuter et afficher une erreur si on fait un int() d'un caractère je pense. J'aimerais plutôt faire une boucle infinie qui ne s'arrete que quand on a bien rentré une suite de 8 chiffres. Donc quand on se trompe à la saisie, le programme le reconnaît et on a une autre chance. Pour le bon nombre de chiffres je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nombre =""
     
    while(len(nombre) != 8):
        nombre=raw_input('entrez 8 chiffres')
    mais pour la saisie de chiffres uniquement, je ne vois pas comment faire autrement que de passer par une regex, a part en faisant un if tres lourd et fastidieux pour chaque caractère. Si tu as une meilleure idée que la mienne n'hésite pas à me la propsoer

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    raw_input retourne un string tout à fait standard, de sorte que tu peux te servir d'un regex dessus comme sur n'importe quoi d'autre.
    En l'occurence, 8 chiffres, ça donne un regex comme celui-ci:
    ^ marque le début de la chaîne
    \d représente un chiffre
    {8} demande de répéter 8 fois ce qui précède
    $ marque la fin de la chaîne

    Tu serais peut-être intéressé par mon petit programme de regex
    http://aspyct.org/doku.php?id=lurt

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Merci de ta réponse antoine, mais je ne vois pas tres bien comment m'en servir, il faut l'utiliser comme un if ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur R&D en apprentissage statistique
    Inscrit en
    Juin 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur R&D en apprentissage statistique

    Informations forums :
    Inscription : Juin 2009
    Messages : 447
    Points : 752
    Points
    752
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import re
     
    my_re = re.compile(r'^\d{8}$')
     
    while True :
      nombre = raw_input('entrez 8 chiffres')
      if my_re.match(nombre) is not None : break
     
    # eventuellement
    nombre = int(nombre)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Points : 79
    Points
    79
    Par défaut
    Merci beaucoup Alexis.M c'est exactement ce que je désirais

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Je ferais ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import re
     
    my_re = re.compile('\d{8}\Z')
     
    nombre = ''
    while not my_re.match(nombre):
      nombre = raw_input('entrez une suite de 8 chiffres  : ')

    Pas besoin de ^ au début puisqu'on utilise match() dans l’instruction.

    r’ ’ inutile puisqu’il n’y a pas d’échappement de chaînes dans l’expression régulière (\d n’est pas un échappement de chaînes, c’est une séquence spéciale d’expressions régulières).

    Dans la mesure où on ne peut pas entrer au clavier un caractère qui soit égal à \n, je préfère \Z qui signale la fin d’une chaîne à $ qui signale la fin d’un string ou un signe de newline. Rubrique: goûts et couleurs.

  9. #9
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par eyquem Voir le message
    r’ ’ inutile puisqu’il n’y a pas d’échappement de chaînes dans l’expression régulière (\d n’est pas un échappement de chaînes, c’est une séquence spéciale d’expressions régulières).
    C'est une chance que Python réagisse correctement. Tu dois normalement échapper le backslash \ si tu n'utilises pas les raw strings
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    '^\\d{8}$'
    # ou
    r'^\d{8}$'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser une police sur serveur
    Par spikto dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 18/01/2008, 14h47
  2. Utiliser une CssClass sur objet dynamique
    Par starkson dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/07/2007, 09h54
  3. utiliser une Bd sur 1 autre machine
    Par yasmine* dans le forum Débuter
    Réponses: 2
    Dernier message: 04/03/2007, 22h21
  4. [ireport] - utiliser une condition sur un field
    Par karibouxe dans le forum iReport
    Réponses: 11
    Dernier message: 15/02/2007, 15h48
  5. [18F452] Utiliser une Table sur un 18F
    Par MCASM dans le forum Autres architectures
    Réponses: 2
    Dernier message: 18/04/2006, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo