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 :

Recherche email dans texte avec Expression reguliere


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut Recherche email dans texte avec Expression reguliere
    Bonjour a toutes et a tous ,
    Debutant , je souhaiterai trouver a partir d' un texte , toute adresse email a l'aide d'une expression reguliere . J'ai essayé mais sans succès .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python3
    import re
     
    s = "Perdue dans l’embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
     
    regex = "[0-9a-b]+@[0-9a-b](.fr|.com)\W"
     
    match = re.match(regex,s)
    if match:
    	print(f"{match} --> Match !!")

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 778
    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 778
    Par défaut
    Salut,

    Citation Envoyé par chris7522 Voir le message
    J'ai essayé mais sans succès
    Quand c'est compliqué, une recherche sur Internet vous permet de savoir ce que d'autres on déjà fait et vous en inspirer.

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

  3. #3
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 925
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    re.match ne permet pas de chercher plusieurs expressions situées n'importe où dans une string(voir doc).
    re.findall est plus adapté à ta recherche.
    Voici ce que je ferai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python3
    import re
     
    s = "Perdue dans l’ embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
    regex = r"(\w+@\w+\.(?:fr|com))"
    match = re.findall(regex,s)
    if match:
    	print(f"{match} --> Match !!")
    Tu peux tester et visualiser une expression ici ----> https://regex101.com/

    édit: simplification ---> regex = r"\w+@\w+\.(?:fr|com)"

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

    Par exemple ici: https://crowd42.github.io/blog/scrip...dresses-email/

    Application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    s = "Perdue dans l’embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
     
    regex = re.compile(r'[\w\.-]+@[\w\.-]+')
     
    emails = re.findall(regex, s)
     
    for email in emails:
        print(email)
    Réponse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    embrasure@gmail.com
    joie@yahoo.fr
    Par contre, je ne sais pas si ça traite tous les cas. En effet, la syntaxe des adresses email est plus complexe qu'on le croit couramment. Voir un petit résumé ici: https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique.

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 925
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Par contre, je ne sais pas si ça traite tous les cas.
    Je trouve l'expression trop permissive.
    En effet la string ' à@lui 'match...
    idem pour .@truc

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

    Citation Envoyé par Hominidé Voir le message
    Je trouve l'expression trop permissive.
    En effet la string ' à@lui 'match...
    idem pour .@truc
    Entièrement d'accord! De même pour "machin..truc@bidule.com" puisque le point doublé est interdit. Mais tout dépend de ce qu'on recherche, et des conséquences d'une erreur: on peut éviter un motif parfait et donc complexe si ça ne vaut pas le coup. On peut aussi trouver des motifs plus élaborés sur le web, par exemple ici: https://www.regular-expressions.info/email.html.

  7. #7
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 925
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    En effet, la syntaxe des adresses email est plus complexe qu'on le croit couramment. Voir un petit résumé ici: https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique.
    En effet....
    En partant de l'illustration de wikipedia:
    Exemples d'adresses valides :

    Abc@example.com
    Abc@10.42.0.1
    Abc.123@example.com
    user+mailbox/department=shipping@example.com
    !#$%&'*+-/=?^_`.{|}~@example.com
    "Abc@def"@example.com
    "Fred Bloggs"@example.com
    "Joe.\\Blow"@example.com
    Loïc.Accentué@voilà.fr8

    Exemples d'adresses non valides :

    Abc.example.com
    Le caractère @ manque.
    Abc.@example.com
    Le caractère . est situé juste avant le caractère @ .
    Abc..123@example.com
    Le caractère . apparaît deux fois de suite.
    En faisant ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regex = r'(?:[^\. ]+\.)?(?:(?:[^\. ]+)|(?:\".+\"))?(?<!\.)@[\w\.-]+'
    , j'ai presque tout bon .
    "Presque" car j'ai une fausse correspondance pour avec Abc..123@example.com que je n'ai pas su éviter ...

    Ps: Il semble que pour pouvoir voir le code ci-dessus qu'il faille se connecter...

  8. #8
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 925
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    "Presque" car j'ai une fausse correspondance pour avec Abc..123@example.com que je n'ai pas su éviter ...
    Résolu!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regex = r'(?<= )(?:[^\. ]+\.)?(?:(?:[^\. ]+)|(?:\".+\"))?(?<!\.)@[\w\.-]+'
    Bon courage à celui qui veut relire

  9. #9
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Citation Envoyé par tyrtamos Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    s = "Perdue dans l’embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
     
    regex = re.compile(r'[\w\.-]+@[\w\.-]+')
     
    emails = re.findall(regex, s)
     
    for email in emails:
        print(email)
    Je te remercie pour ton aide . Ce motif me convient parfaitement !

  10. #10
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python3
    import re
     
    s = "Perdue dans l’ embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
    regex = r"(\w+@\w+\.(?:fr|com))"
    match = re.findall(regex,s)
    if match:
    	print(f"{match} --> Match !!")
    Merci de ton aide .
    Pour ton motif , tu as utilisé un groupe intégré dans un autre groupe , c'est ca ?
    Pourquoi as tu utilisé des parentheses ?
    Que signifie " ?: " dans (?:fr|com)

  11. #11
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 925
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par chris7522 Voir le message
    Que signifie " ?: " dans (?:fr|com)
    (?:...)
    Une version sans capture des parenthèses habituelles. Valide n'importe quelle expression rationnelle à l'intérieur des parenthèses, mais la sous-chaîne correspondant au groupe ne peut pas être récupérée après l'analyse ou être référencée plus loin dans le motif.
    Tu as la doc en français ici : https://docs.python.org/fr/3/library/re.html
    Personnellement, je l'ai imprimée afin de pouvoir m'y référer si besoin...

    Les parenthèses permettent de défénir des groupes(voir doc)...
    Si ça t'intéresse pour t'exercer:
    https://regexone.com/



    [/QUOTE]

  12. #12
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2025
    Messages : 1
    Par défaut Je pense que tu peut utiliser la methode split pour decouper ta chaine et passer par une boucle pour iterer
    import re as b

    s = "Perdue dans l’ embrasure@gmail.com où la porte t’enferme,tes yeux sillaient de joie@yahoo.fr et ta bouche pleurait.J’attendais, je partais, tout indécis et ferme,mais saisi par ton cœur que j’allais emporter."
    seconde = s.split(" ")
    regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    for x in seconde:
    match = b.match(regex,x)
    if match:
    print(f"{match} --> Match !!")

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 003
    Par défaut
    Je sais qu'il s'agit d'un forum python.
    Mais en C#, Microsoft propose une classe pour valider un email, et le code est disponible.
    https://github.com/microsoft/referen...ssAttribute.cs

    Et on y retrouve le pattern suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";

    J'ai encore quelques lacunes en python donc je n'ai pas réussi à traduire exactement cette regex.
    C'est donc certainement améliorable mais voici, ce que je suis parvenu à réaliser (et à adapter par rapport à ce que j'ai retenu de la RFC)
    Code python : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    import re
     
    class EmailAddressValidator:
     
        EMAIL_REGEX_PATTERN = (
            r"(?:[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+"
            r"(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
            r'"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]'
            r'|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")'
            r"@"
            r"(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+"
            r"[a-zA-Z]{2,}|"
            r"\[(?:(?:25[0-5]|2[0-4][0-9]|[21]?[0-9][0-9]?)\.){3}"
            r"(?:25[0-5]|2[0-4][0-9]|[21]?[0-9][0-9]?|"
            r"[a-zA-Z-]*[a-zA-Z]:"
            r'(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]'
            r"|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])"
        )
        def __init__(self):
            self._regex = re.compile(self.EMAIL_REGEX_PATTERN, re.IGNORECASE)
     
        def is_valid(self, value):
            value_as_str = str(value)
            return bool(self._regex.match(value_as_str))
     
    if __name__ == "__main__":
        validator = EmailAddressValidator()
     
        emails = [
            "contact@example.com",
            "jean.dupont123@domain.fr",
            "user.name+tag+sorting@example.com",
            "alice.bob@sub.domain.com",
            "test_email@university.edu",
            "prenom-nom@societe.co.uk",
            "adresse@exemple.museum",
            "info@mail-service.org",
            "nom@exemple.xyz",
            "john_doe@company.io",
            "plainaddress",
            "@missinguser.com",
            "user.com",
            "user@.com",
            "user@com.",
            "user@site..com",
            ".user@domain.com",
            "user@domain.com.",
            "user@domain,com",
            "user@@domain.com",
            "Abc..123@example.com"
        ]
     
        for email in emails:
            result = validator.is_valid(email)
            print(f"{email}: {'valide' if result else 'non valide'}")

    Cela ressort ceci :
    contact@example.com: valide
    jean.dupont123@domain.fr: valide
    user.name+tag+sorting@example.com: valide
    alice.bob@sub.domain.com: valide
    test_email@university.edu: valide
    prenom-nom@societe.co.uk: valide
    adresse@exemple.museum: valide
    info@mail-service.org: valide
    nom@exemple.xyz: valide
    john_doe@company.io: valide
    plainaddress: non valide
    @missinguser.com: non valide
    user.com: non valide
    user@.com: non valide
    user@com.: non valide
    user@site..com: non valide
    .user@domain.com: non valide
    user@domain.com.: valide
    user@domain,com: non valide
    user@@domain.com: non valide
    Abc..123@example.com: non valide

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 152
    Par défaut
    Hello,

    En python on a des modules qui existent et qui sont bien plus robustes comme par exemple email-validator (la référence) : https://pypi.org/project/email-validator/

    Il y a aussi pyIsEmail qui est plus basé sur une conformité stricte...

    Pour les regex, si on veut bien faire faudrait savoir si ces mails passent,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    jean.dupont(commentaire)@example.com
    prénom.nom@例子.com
    utilisateur@[IPv6:2001:db8::1]
    Des mails comme ceux ci-dessous passent peut-être et sont correctes selon la RFC mais là plupart des serveurs de messagerie t'envoient bouler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "jean..dupont"@example.com
    Donc valide oui, mais pas en pratique

    Est-ce que la regex limite en longueur, là aussi il y a des règles, voir RFC ?

    Malgré le fait que se soit un bon exercice, je trouve cette approche défaillante en terme de fiabilité, de sécurité et de maintenabilité.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Error avec expression Reguliere dans FileMask
    Par delilou dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 22/03/2011, 11h48
  2. Recherche d'un texte avec "find data"
    Par Kiroukool dans le forum Toad
    Réponses: 0
    Dernier message: 31/01/2008, 14h34
  3. [RegEx] trouver un telephone avec expression reguliere
    Par tobiclick dans le forum Langage
    Réponses: 4
    Dernier message: 21/11/2006, 16h42
  4. [RegEx] Pb avec expressions regulieres
    Par Oreily dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2006, 01h34
  5. probleme avec expression reguliere
    Par naourass dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/11/2005, 12h15

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