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 :

problème avec expression régulière


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 problème avec expression régulière
    Bonjour,

    Voilà depuis quelques temps, je me heurtes à un problème avec les expressions régulières. Je voudrais que l'expression vérifie que le nom de machine entré:

    ==> commence par une lettre (obligatoire)
    ==> ensuite le nom peut contenir des lettres, des chiffres et éventuellement le symbole "-"
    ==> pas de différence entre les miniscules et majuscules

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
     
    def host(machine):
    	m=re.search('^(([a-zA-Z]){1})([a-zA-Z0-9\-])$', machine)
    	try:
    		print "OK"
    	except:
    		return False
    Quand je teste un nom avec une minuscule/majuscule en 1ère lettre : pas de problème.
    Par contre lorsque le nom commence par un chiffre et/ou contient un symbole autre que "-", il m'affiche "OK", alors qu'il ne devrait pas.

    Je tourne en rond donc si quelqu'un à une solution, elle est la bien venue.

    Merci

  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,

    le problème vient du try, pas du pattern

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import re
    pattern = re.compile(r'^[a-z][a-z0-9\-]*',re.IGNORECASE)
    def host(machine):
       if pattern.match(machine):
          return True
       else:
          return False

  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
    Merci c'est exactement ce que je voulais... mais par contre si je rentre un symbole autre que "-", il me retourne la valeur "True" alors qu'il ne devrait pas. Pour accepter un symbole, ne faut-il pas mettre un "\" devant?

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



    Il est préférable de n'utiliser ^ et $ que lorsque l'option re.MULTILINE est activée. Cette activation n'est faite que lorsque la chaîne explorée est susceptible d'avoir des fins de ligne et que l'on veut que le métacaractère point puisse matcher avec une fin de ligne.

    En dehors de ce cas, ^ et $ représentent une petite lourdeur additionnelle et inutile dans la regex formée par rapport à l'utilisation de \A et \Z qui ne matchent que le début et la fin d'une chaîne.





    Dans [a-zA-Z]{1} , la partie {1} est inutile: [a-zA-Z] symbolise déjà UN caractère.

    Par contre, après [a-zA-Z0-9\-] il manquait un quantificateur * ou + ou {x}





    Placé en position terminale entre crochets, un - ne peut pas avoir sa signification spéciale. Le compilateur de regex ne le considère donc pas comme un métacaractère et il n'est par conséquent pas nécessaire de mettre un antislash devant.

    Idem s'il est en première position entre crochets.













    La réponse de kango me chagrine sur trois points:



    - en utilisant match() on intime à la regex de matcher dés le début de la chaîne explorée => ^ est inutile dans la RE



    - pattern.match(machine) renvoie soit un objet Regex soit None: c'est une alternative qui vaut bien celle de False/True que renvoie son écriture de host(). On peut très bien se débrouiller à coder avec la première alternative et chercher autre chose me semble inutile



    - sans \Z à la fin de la RE on n'oblige pas que le matching se produise sur la totalité de la chaîne explorée. Dit autrement, on autorise le matching partiel dans la chaîne. C'est ce qui arrive par exemple sur 'a9879=87ui' : le match concerne 'a9879'



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
     
    pat = re.compile('[a-z][a-z0-9-]*\Z',re.IGNORECASE)
     
    print pat.match('a455-098')
    print pat.match('w34=908')
    print
    print pat.search('>>i8794-78')
    print re.search('\A[a-z][a-z0-9-]*\Z','>>i8794-78',re.IGNORECASE)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <_sre.SRE_Match object at 0x010A8EC8>
    None
     
    <_sre.SRE_Match object at 0x010A8EC8>
    None

  5. #5
    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
    Citation Envoyé par eyquem Voir le message
    - en utilisant match() on intime à la regex de matcher dés le début de la chaîne explorée => ^ est inutile dans la RE
    c'est tout à fait exact


    Citation Envoyé par eyquem Voir le message
    - pattern.match(machine) renvoie soit un objet Regex soit None: c'est une alternative qui vaut bien celle de False/True que renvoie son écriture de host(). On peut très bien se débrouiller à coder avec la première alternative et chercher autre chose me semble inutile
    c'est exact. l'approche fonction renvoyant True ou False permet de "masquer" que le traitement est fait avec une re. Si par exemple le traitement doit être utilisé par une personne ne connaissant pas les regex (une autre personne que Kevins donc) la fonction est "naturelle" à utiliser. C'est une sorte d'encapsulation, un peu comme ce que procure l'aspect orienté-objet. je trouve qu'il est parfois utile de masquer les "gory details" pour rendre la réutilisation plus user-friendly



    Citation Envoyé par eyquem Voir le message
    - sans \Z à la fin de la RE on n'oblige pas que le matching se produise sur la totalité de la chaîne explorée. Dit autrement, on autorise le matching partiel dans la chaîne. C'est ce qui arrive par exemple sur 'a9879=87ui' : le match concerne 'a9879'
    tout à fait aussi ! c'est ce qui explique le problème que tu as eu en testant mon code kevins.

  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
    C'est parfait c'est exactement ce que je voulais.
    Merci pour vos solutions et explications, les RE sont un peu plus clairs maintenant.

  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
    @ kango

    C'est une sorte d'encapsulation, un peu comme ce que procure l'aspect orienté-objet. je trouve qu'il est parfois utile de masquer les "gory details" pour rendre la réutilisation plus user-friendly
    OK avec ça. Parfois utile de masquer, oui.
    En l’occurence cependant j’ai donné (inconsciemment) une explication en m’adressant à un développeur et non pas à un utilisateur.
    Perso, j’aime bien utiliser des trucs dont je comprends le fonctionnement et j’aime bien aller voir sous le capot pour décortiquer les trucs obscurs. Cette notion d’encapsulation, au sens de camouflage, me rebute un peu.

    Mais bon, ton “encapsulation“ ressemble à une robe d’été très légère: on voit beaucoup à travers

    "gory details" .... sacré kango. Je ne connaissais pas l'expression. Qui ne s'applique pas tellement d'ailleurs dans le cas présent: la robe d’été n’est pas très sanglante.

  8. #8
    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
    Citation Envoyé par eyquem Voir le message
    Cette notion d’encapsulation, au sens de camouflage, me rebute un peu.
    'faut pas, ça fait pas mal

    non plus sérieusement, lorsque l'on construit des applications complexes, on n'a pas vraiment le choix d'utiliser l'existant sans maitriser totalement ce qui est à l'intérieur.

    je pense que si on creuse tout, on devient fou ! parce qu'on peut creuser et creuser et encore creuser.

    lorsque tu prends l'avion, tu sais par expérience que les ailes ne vont pas se briser en l'air, pourtant tu ne t'en ai pas assuré toi même mathématiquement"

    mais je comprends ce que tu veux dire, j'aime bien mettre les mains dans le cambouis de temps en temps voir comment ça marche, parfois (souvent ?) on apprend des choses

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

Discussions similaires

  1. Problème avec expression régulière
    Par Nico128 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/12/2012, 17h41
  2. Problème avec expression régulière
    Par Snote100024 dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 19/04/2011, 07h48
  3. problème avec expressions régulières
    Par washh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/08/2008, 18h35
  4. Problème avec expression régulière
    Par zoidy dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/08/2007, 09h43
  5. [RegEx] Problème avec expressions régulières.
    Par Cygnus Saint dans le forum Langage
    Réponses: 12
    Dernier message: 14/08/2006, 11h55

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