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 :

Parsing avec expressions régulières [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Par défaut Parsing avec expressions régulières
    Bonjour,

    Je débute en python et j'essaie de réaliser un petit programme qui applique des équations mathématiques.
    Afin de vérifier si les arguments entrés par l'utilisateur dans le programme sont corrects (en l’occurrence des floats),
    j'essaie de mettre en place un petit parsing. Néanmoins je bloque un peu actuellement. J'essaie d'utiliser les expressions régulières
    mais ça n'a pas l'air de vraiment fonctionner
    Voici un bout du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import sys, re
     
    pattern = re.compile("[0-9.-]*$")
    res = pattern.match(sys.argv[1])
    if res:
        print "Argument valide"
    else:
        print "Argument non valide"
    Dans cet exemple j'essai de parser le premier argument donné.
    Si il contient des caractères entre 0 et 9, des points ou des - je le valide.
    Mais le if est toujours vrai je ne sais pas d'ou viens le problème.

    Quand j'essaie d'afficher res:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >_sre.SRE_MATCH object at et l adresse (0x.....)
    Sinon existe t-il des autres fonctions qui permettent un parsing similaire ?
    Un équivalent du strspn en C ? Je n'ai pas trouvé de fonction semblable.

    Merci de vos réponses

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Pas le temps de tester mais déjà, en python3, les "print" sont suivis de parenthèses.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Pas le temps de tester mais déjà, en python3, les "print" sont suivis de parenthèses.
    Merci pour ce message utile.
    Je travaille sur Python 2.X donc désolé de mettre trompé de version.

    Je doute également que les print soient le principal problème sur le fonctionnement du code.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par Googø Voir le message
    Afin de vérifier si les arguments entrés par l'utilisateur dans le programme sont corrects (en l’occurrence des floats), j'essaie de mettre en place un petit parsing. Néanmoins je bloque un peu actuellement. J'essaie d'utiliser les expressions régulières
    Si vous débutez, normal que la documentation ne vous soit pas assez familière pour la regarder. Dommage car vous y trouveriez les patterns permettant d'émuler scanf dans ce paragraphe.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Si vous débutez, normal que la documentation ne vous soit pas assez familière pour la regarder. Dommage car vous y trouveriez les patterns permettant d'émuler scanf dans ce paragraphe.

    - W
    Merci beaucoup, après quelques tests en suivant les exemples j'ai bien compris le fonctionnement et j'ai résolu mon problème.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonsoir,

    je sais que vous êtes partis sur l'idée de parser vous-mêmes les arguments mais il existe une librairie dédiée pour ça sous python 2 et 3 :

    python.org - argparse - Parser for command-line options, arguments and sub-commands

    Je me suis plongé sur cette solution pas plus tard qu'hier et j'ai fini par l'adopter.

    Un exemple avec des arguments attendus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import argparse # Parser for command-line options, arguments and sub-commands
     
    parser = argparse.ArgumentParser()
     
    # Required argument
    parser.add_argument('x', type=float, help="Floating value")
    args = parser.parse_args()
    print(args)
    print("x =", args.x)
    Ce qui donne :

    python arg_test.py
    usage: arg_test.py [-h] x
    arg_test.py: error: the following arguments are required: x


    python arg_test.py 1.5
    Namespace(x=1.5)
    x = 1.5

    Pour qu'il soit optionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import argparse # Parser for command-line options, arguments and sub-commands
     
    parser = argparse.ArgumentParser()
     
    # Optional argument
    parser.add_argument('x', nargs='?', type=float, default=0.0, help="Floating value")
    args = parser.parse_args()
    print(args)
    print("x =", args.x)
    python arg_test.py
    Namespace(x=0.0)
    x = 0.0

    Pour un nombre d'arguments inconnus :

    Méthode sans flag de longueur '*' pour infinie ou connus en inscrivant la valeur int (ex: nargs=2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import argparse # Parser for command-line options, arguments and sub-commands
     
    parser = argparse.ArgumentParser()
     
    # Variable arguments
    parser.add_argument('values', nargs='*', type=float, help="Floating values")
    args = parser.parse_args()
    print(args)
    print("values =", args.values)
    python arg_test.py 1 2 3 4
    Namespace(values=[1.0, 2.0, 3.0, 4.0])
    values = [1.0, 2.0, 3.0, 4.0]

    Et avec des flags :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import argparse # Parser for command-line options, arguments and sub-commands
     
    parser = argparse.ArgumentParser()
     
    # Flagged arguments
    parser.add_argument('-x', type=float, help="Floating value")
    parser.add_argument('-y', type=float, help="Floating value")
     
    args = parser.parse_args()
    print(args)
    print("x + y =", args.x + args.y)
    python arg_test.py -x 0.5 -y 1.5
    Namespace(x=0.5, y=1.5)
    x + y = 2.0

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

Discussions similaires

  1. [PEAR][HTML_QuickForm] Création de filtre avec expression régulière
    Par audran12 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/06/2007, 11h31
  2. pb avec expression régulière (regex)
    Par rudhf dans le forum C#
    Réponses: 12
    Dernier message: 10/05/2007, 15h20
  3. [RegEx] Contrôle avec expression régulière
    Par lodan dans le forum Langage
    Réponses: 8
    Dernier message: 23/10/2006, 19h32
  4. [RegEx] Problème avec expressions régulières.
    Par Cygnus Saint dans le forum Langage
    Réponses: 12
    Dernier message: 14/08/2006, 11h55
  5. [C#] Caractères hexadécimal avec expressions régulières
    Par shinchan dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/01/2006, 11h41

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