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 :

vérification de syntaxe


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Points : 17
    Points
    17
    Par défaut vérification de syntaxe
    Bonjour,

    Je souhaite vérifier la syntaxe d'une adresse MAC dans mon script. Cette vérification doit s'assurer que les octets de l'adresse soient compris entre 0-9 et A-F, que chaque octet séparé soit par " : " et que l'utilisateur ne puisse entrer ni plus ni moins de 6 octets .

    Quelqu'un aurait-il une solution pour effectuer cette vérification? ou me donner un module qui me permettrait de faire cela.

    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà une petite fonction qui devrait faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def verifmac(mac):
        """Verification d'une adresse MAC"""
        L = mac.split(':')
        if len(L) != 6:
            return False
        for ch in L:
            try:
                x = int(ch,16)
            except ValueError:
                return False
            if x<0 or x>255:
                return False
        return True
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    print verifmac("5E:FF:56:A2:AF:15")
    True
     
    print verifmac("5E:FF:56:A2:AF")
    False
     
    print verifmac("5E:FF:QS:A2:AF:15")
    False
     
    print verifmac("5E:FF:560:A2:AF:15")
    False
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Ma question va te paraître bête mais est-ce que tu pourrais m'expliquer ton code? A partir de la boucle "for", je ne comprends pas trop

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Coucou !
    Je trouve que c'est le genre de problème taillé sur mesure pour les expressions régulières (puissant).
    Voici une solution, je crois qu'elle fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import re
     
    def verify(ad):
        m = re.search(r'^(([0-9A-F]{2}:){5})([0-9A-F]{2})$', ad)
        try:
            return m.group() == ad
        except:
            return False
     
     
    if __name__ == "__main__":
        for s in ["5E:FF:56:A2:AF:15", 
                   "5E:FF:56:A2:AF", 
                   "5E:FF:QS:A2:AF:15",
                   "5E:FF:560:A2:AF:15"]:
            print s, verify(s)
    donne True, False, False, False.

    Comme tu parais être encore débutant (ou novice) (je le suis encore...) tu pourrais préférer la solution facile à comprendre de Tyrtamos. (ça c'est un gros avantage. pour la performance, comme les chaines à traiter sont petites, c'est tout à fait viable. mais je profite de l'occasion pour t'indiquer un lien (en bas))

    NB comment déchiffrer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '^(([0-9A-F]{2}:){5})([0-9A-F]{2})$'
    "^" : début de la chaine de caracteres.
    "$" : fin de la chaine.
    "[0-9A-F]{2}:" : on veut (exactement!) deux caracteres appartenant à l'ensemble {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}, suivi d'un symbole ":".
    "(...){5}" : on veut 5 fois ce qui precede dans les parentheses
    etc..
    A première vue ça parait difficile(incomprehensible) mais il m'a fallu seulement 20 secondes pour l'écrire, et du premier coup elle fonctionnait, et je n'ai pas d'expérience dans ce domaine.

    PLus d'info: http://docs.python.org/library/re.html

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    boucle for de tyrtamos:

    il suppose que les chaines de caracteres sont des representations d'un nombre en notation hexadecimale de deux digits. Alors il les convertit. S'il y a une erreur (exception) , ça veut dire que c'en était pas (des nombre en notation hex). D'où le 'return False' dans la clause 'except'.
    Pareil pour le dernier test. Les nombres sont censés etre de la forme xy avec x et y dans {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}. ni trop grands, ni négatifs. Apparement les nombres acceptables sont des nombres dans l'intervalle [0,255].

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Franchement miawaw tu as bien de la chance parce que moi j'ai passé un temps fou pour essayer de sortir quelque chose, j'avais déjà regardé le lien que tu m'as envoyé mais sans résultat.

    Pourquoi dans le script de tyrtamos, il précise entre et 0 et 255, si moi je désire que sa soit compris entre 0-9 et A-F? (je sais pas si tu pourras me répondre ^^)

  7. #7
    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
    Bonjour,

    Je ne comprends pas ce qui est appelé ici “octets de l’adresse“.

    un octet = un caractère ?
    Auquel cas il y aurait plus de 6 octets dans "5E:FF:56:A2:AF:15"

    un octet = séparé des autres par ’:’ ?
    Auquel cas les octets de "5E:FF:56:A2:AF:15" ne sont pas dans les ensembles 0-9 et A-F.

    Soit la réponse de tyrtamos s'écarte de l'énoncé, soit celui-ci est imprécis et Tyrtamos compense son imprécision

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour eyquem,

    1 octet = un ensemble de 8 positions binaires permettant de coder 256 nombres de 0 à 255. Donc en hexa: de 00 à FF (exemple: hex(255)=0xFF et int('FF', 16)=255).

    Les adresses mac ([ame="http://fr.wikipedia.org/wiki/Adresse_MAC"]http://fr.wikipedia.org/wiki/Adresse_MAC[/ame]) comportent 6 octets qui sont traditionnellement indiqués en hexa et séparés par des ':'.

    En ce qui me concerne, je n'ai fait aucun test sur chacun des caractères.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par kevins Voir le message
    Franchement miawaw tu as bien de la chance parce que moi j'ai passé un temps fou pour essayer de sortir quelque chose, j'avais déjà regardé le lien que tu m'as envoyé mais sans résultat.
    peut-etre que ça va plus te plaire. (en anglais)

    Citation Envoyé par miawaw Voir le message
    A première vue ça parait difficile(incomprehensible) mais il m'a fallu seulement 20 secondes pour l'écrire, et du premier coup elle fonctionnait, et je n'ai pas d'expérience dans ce domaine.
    Hum, peut-être quand même une minute ou deux.


    Citation Envoyé par kevins Voir le message
    Pourquoi dans le script de tyrtamos, il précise entre et 0 et 255, si moi je désire que sa soit compris entre 0-9 et A-F? (je sais pas si tu pourras me répondre ^^)
    Tyrtamos a déjà répondu. (à 18h02 )

    ciao

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

Discussions similaires

  1. [PDO] Vérification de syntaxe
    Par binco dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/01/2015, 02h31
  2. [Débutant] Vérification de Syntaxe Avancée
    Par ShaiLeTroll dans le forum C++Builder
    Réponses: 0
    Dernier message: 23/12/2010, 16h03
  3. [MySQL] Vérification de syntaxe sur un echo d'un code mysql
    Par Marc22 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/03/2010, 13h51
  4. [RegEx] Vérification de syntaxe
    Par Woodgate dans le forum Langage
    Réponses: 2
    Dernier message: 12/02/2007, 19h52
  5. Réponses: 3
    Dernier message: 07/06/2005, 14h44

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