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 :

regex pour tester un mail ou une URL


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut regex pour tester un mail ou une URL
    Bonjour,
    la réponse est sûrement dans ce forum mais j'ose quand même la (re)poser.

    Comment savoir si un texte donné est à peu près une adresse HTML ?

  2. #2
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Ce que tu appelles adresse HTML est une URL. Elle peut avoir toutes sortes de formes correctes...

    Le plus simple est d'utiliser la lib urlparse à voir (ici).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import urlparse
    >>> o = urlparse.urlparse('http://docs.python.org/library/urlparse.html')
    >>> o
    ParseResult(scheme='http', netloc='docs.python.org', path='/library/urlparse.html', params='', query='', fragment='')
    Il te suffit de vérifier que o.scheme vaut bien "http".
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Le souci c'est que cela marche sur une adresse complète. Quelque chose comme "www.google.com" n'est pas repéré.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Comme j'en avais besoin il y a quelques mois, je me suis penché sur la vérification des adresses mail par regex. C'est ici:

    http://python.jpvweb.com/mesrecettes...f_adresse_mail

    Le problème, c'est que les normes permettent des syntaxes d'adresses mails très complexes, voire farfelues (ex: l'adresse !d!x\\y~z%abc@example.com est valide).

    Comme je voulais seulement détecter des fautes de frappes après saisie au clavier, j'ai simplifié un peu, quitte à avoir quelques "faux non-conformes". Mais tu peux rajouter ce qui manque... à condition d'éplucher les normes (j'en donne les adresses).

    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

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci, je vais étudier cela dès que possible et je reviendrais à l'attaque ici.

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Je déterre ce post car je me heurte au problème suivant :
    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
    17
    18
    19
    20
    21
    # -*- coding: utf-8 -*-
    #! /usr/bin/env python
    import re
     
    # The following pattern commes from the following page :
    #    http://python.jpvweb.com/mesrecettespython/verif_adresse_mail
    PATTERN_MAIL = re.compile(r"""
        ^                       # beginning of string
        [a-zA-Z0-9_\-]+         #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere)
        (\.[a-zA-Z0-9_\-]+)*    #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point
        @                       #l'inevitable arrobas
        [a-zA-Z0-9_\-]+         #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere)
        (\.[a-zA-Z0-9_\-]+)*    #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point
        (\.[a-zA-Z]{2,6})       #il y a forcement un dernier mot uniquement alphabetique, de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum") et precede par un seul point
        $                       # end of string
        """)
     
    def isSimpleMail(stringToTest):
        return bool(PATTERN_MAIL.search(stringToTest))
     
    print(str(isSimpleMail("mail@club.fr")))
    J'obtiens FALSE et non TRUE comme espéré.

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Le problème vient de ma syntaxe multiligne car le code suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # -*- coding: utf-8 -*-
    #! /usr/bin/env python
    import re
     
    # The following pattern commes from the following page :
    #    http://python.jpvweb.com/mesrecettespython/verif_adresse_mail
    PATTERN_MAIL = re.compile(r"^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*(\.[a-zA-Z]{2,6})$")
     
    def isSimpleMail(stringToTest):
        return bool(PATTERN_MAIL.search(stringToTest))
     
    print(str(isSimpleMail("mail@club.fr")))

    Comment avoir une présentation multiligne afin de la commenter ?

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne crois pas que ça puisse marcher en multiligne, et surtout pas avec une remarque (#...) à chaque ligne. Et dans la mesure où l'espace et l'antislash sont des caractères spéciaux dans les motifs, je ne vois pas comment faire.

    Par contre, j'aime bien raisonner en multiligne pour construire et mettre au point des motifs complexes. Mais je passe en monoligne pour appliquer.

    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 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
    Bonsoir,


    Il y a deux solutions:


    - bien lire la doc:

    http://python.developpez.com/cours/D...ns/verbose.php
    La chose la plus importante à se rappeler lorsqu'on utilise des expressions régulières détaillées est qu'il faut passer un argument supplémentaire : re.VERBOSE est une constante définie dans le module re qui signale que le motif doit être traité comme une expresion régulière détaillée. Comme vous le voyez, ce motif comprend beaucoup d'espaces (qui sont tous ignorés) et plusieurs commentaires (qui sont tous ignorés). Une fois enlevés les espaces et les commentaires, on obtient exactement la même expression régulière que nous avons vu à la section précédente, mais elle est beaucoup plus lisible.

    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
    17
    18
    19
    # -*- coding: utf-8 -*-
    #! /usr/bin/env python
    import re
     
    PATTERN_MAIL = re.compile(r"""
        ^                       # beginning of string
        [a-zA-Z0-9_\-]+         #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere)
        (\.[a-zA-Z0-9_\-]+)*    #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point
        @                       #l'inevitable arrobas
        [a-zA-Z0-9_\-]+         #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere)
        (\.[a-zA-Z0-9_\-]+)*    #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point
        (\.[a-zA-Z]{2,6})       #il y a forcement un dernier mot uniquement alphabetique, de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum") et precede par un seul point
        $                       # end of string
        """,re.VERBOSE)
     
    def isSimpleMail(stringToTest):
        return bool(PATTERN_MAIL.search(stringToTest))
     
    print(str(isSimpleMail("mail@club.fr")))

    Il faut bien lire la doc de "Plonger dans Python" parce que
    http://www.developpez.net/forums/d22...n/#post5006484




    - faire comme je l’ai découvert un jour, en oubliant une vigule dans un tuple qui me servait de RE :

    Cela repose sur le fait que des chaînes rencontrées les unes à la suite des autres par l’interpréteur sont automatiquement concaténées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ch = 'Louis' 'ian' "a H" 'igh' 'way 940'
    print ch
    Louisiana Highway 940
    Et manifestement, quand ces chaînes distinctes sont placées entre parenthèses, elles peuvent être situées sur plusieurs lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ch = ('Waermund II (or Wær' "mund) was a m" 'edieval Bi' 'shop'
    "of Roches" "ter.\n" 'He was co' 'n''s''ec''rat' 'ed be' 'tween'
    ' ' '8' "45 and" ' 862. He died betwee' 'n 860 and 868.')
    print ch
    Waermund II (or Wærmund) was a medieval Bishopof Rochester.
    He was consecrated between 845 and 862. He died between 860 and 868.

    Et donc ceci marche aussi:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # -*- coding: utf-8 -*-
    #! /usr/bin/env python
    import re
     
     
     
    REe = ('^'                       # beginning of string
          '[a-zA-Z0-9_\-]+'         #il y a un premier mot compose de caracteres alphanumeriques
                                    #et/ou le blanc souligne et/ou le tiret (mot eventuellement
                                    #reduit a 1 seul caractere)
          '(\.[a-zA-Z0-9_\-]+)*'    #il peut y avoir eventuellement d'autres mots
                                    #de même composition, chacun precede d'un seul point
          '@'                       #l'inevitable arrobase
          '[a-zA-Z0-9_\-]+'         #il y a un premier mot compose de caracteres alphanumeriques
                                    #et/ou le blanc souligne et/ou le tiret (mot eventuellement
                                    #reduit a 1 seul caractere)'
          '(\.[a-zA-Z0-9_\-]+)*'    #il peut y avoir eventuellement d'autres mots de même
                                    #composition, chacun precede d'un seul point
          '(\.[a-zA-Z]{2,6})'       #il y a forcement un dernier mot uniquement alphabetique,
                                    #de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum")
                                    #et precede par un seul point
          '$' )                     # end of string
     
     
    def isSimpleMail(stringToTest):
        return bool(PATTERN_MAIL.search(stringToTest))
     
    print(str(isSimpleMail("mail@club.fr")))

    L’avantage est qu’il n’y a pas besoin de s’embêter à savoir où il faut placer le re.VERBOSE, et que ça permet d’avoir des blancs dans la RE, ce qui n’est pas le cas dans une RE détaillée

    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
    17
    18
    19
    20
    21
    22
    ch = """debut
    carabistouille 1567 UU
    palatino
    fin"""
     
    # NB  ch vaut 'debut\ncarabistouille 1567 UU\npalatino\nfin'
     
    import re
     
    patver = re.compile("""    # saut de ligne
    .+?oui\w+ \d+ UU  # uh uh uh 
    .{2}latin.+   # zagalou
    """,re.VERBOSE)
     
    patesp = re.compile('\n'  # saut de ligne
                        '.+?oui\w+ \d+ UU'  # uh uh uh
                        '\n'   # saut
                        '.{2}latin.+' # zagalou
                        '\n' ) # garggg)
     
    print patver.search(ch)
    print patesp.search(ch)
    None
    <_sre.SRE_Match object at 0x010A2BB8>

  10. #10
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Il faut bien lire la doc de "Plonger dans Python" parce que
    http://www.developpez.net/forums/d22...n/#post5006484
    Hum, hum, moi et les regex, un vrai cauchemar...
    En fait, j'ai été payé pour écrire le post cité.

    Le re.verbose me va.
    Les autres solutions sont moins "jolies".

    Merci.

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bravo eyquem, ça c'est intéressant: j'adopte!

    Je préfère aussi la solution VERBOSE.

    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

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2007, 11h08
  2. Tester la validité d'une url d'un site web
    Par italiasky dans le forum Langage
    Réponses: 21
    Dernier message: 28/02/2007, 15h39
  3. Module Mechanize : tester la disponibilité d'une URL
    Par alphabilel dans le forum Modules
    Réponses: 3
    Dernier message: 27/02/2007, 14h14
  4. Fonction pour tester l'existence d'une image
    Par nais_ dans le forum Langage
    Réponses: 4
    Dernier message: 10/09/2006, 11h38
  5. [web] tester la validiter d'une URL
    Par zebiloute dans le forum Web
    Réponses: 4
    Dernier message: 25/11/2002, 16h51

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