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

Algorithmes et structures de données Discussion :

Extraire des emails d'un texte sans utiliser les expressions régulières


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut Extraire des emails d'un texte sans utiliser les expressions régulières
    Bonjour. Mon problème est assez simple : j'aimerais extraire des adresses email d'une chaîne de caractères sans faire recours aux expressions régulières. Quelle serait la meilleure manière d'y parvenir ? Peu importe votre langage de programmation, ça me fera vraiment plaisir de vous lire. Merci.

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Bonjour,

    Si je traduis bien ton «sans recourir aux regexp» par «sans recourir à une bibliothèque externe pour gérer les regexp» alors le plus simple est de créer manuellement ton automate de reconnaissance d'adresses mails à partir de la regexp. Soit tu la fais hyper complète, soit sur mesure à tes propres besoins. Tu trouvevas tout ce qu'il faut pour le faire grâce à notre ami google.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Merci WhiteCrow pour votre réponse. Toutefois, je n'ai pas compris ce que vous entendez par "à partir de la regexp". Ce que je voudrais, c'est bien créer _manuellement_ un automate de reconnaissance d'adresses mails en utilisant par exemple des fonctions simples de manipulation de chaînes. Tout ce que j'ai vu jusqu'ici sur Google est basé sur les regex.

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Les regexp ne sont qu'un moyen pratique pour décrire un automate. Donc si on a une regexp on peut facilement retrouver l'automate déterministe et à partir de là l'implémenter …
    Il y a de nombreux liens sur le net pour la description de l'algorithme comme sur geeksforgeeks.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Merci à vous. Je vais explorer la piste pour voir.

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    D'où vient cette contrainte de travailler sans regex ? Parce que c'est vraiment une très mauvaise voie.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Bonjour Flodelarab,
    Merci pour votre intervention. Moi même, ça ne me plaît pas plus que ça. Je développe une application Windows sous Windev. Cet environnement fournit une fonction qui permet uniquement de vérifier si une chaîne de caractères respecte la condition d'une expression régulière ou pas. Ça ne va pas plus loin que ça. Une formule pour sélectionner plusieurs occurence d'une chaîne respectant un regex est déjà trop complexe pour le langage proposé. Du coup, je n'ai pas trouvé d'autres solutions que de travailler sans les regex.

  8. #8
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut
    Un algorithme simple est de chercher tous les @. Pour chacun d'eux sélectionner les caractères avant le @ jusqu'à l'espace précédent et sélectionner les caractères après le @ jusqu'à l'espace suivant. Tu va ainsi extraire toutes les adresses mail de ton texte et tu n'utilises pas de regex.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Merci anadoncamille pour votre proposition. Cependant, un exemple de chaînes qui peut être récupéré avec votre algorithme est :
    email:anadon.camille@dev.com.
    Ou encore :
    <b>anadon.camille@dev.com</b>
    Ce ne sont pas vraiment des adresses email, si vous voyez de quoi je veux parler.

  10. #10
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut
    Effectivement.

    Pour éviter ce problème tu as plusieurs possibilités.
    - écrire une fonction qui teste si le caractère fait partie d'une adresse mail classique (lettres, chiffres, point, etc...)
    - écrire une fonction qui teste si le caractère ne fait pas partie d'une adresse mail classique (caractères spéciaux, espace, etc...)

    Dans les deux cas tu te sers de ta fonction pour déterminer si le caractère lu est à ajouter à l'adresse mail ou si il faut cesser la lecture.

  11. #11
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Si on veut une reconnaissance à toute épreuve alors il vaut mieux passer par l'expression rationnelle et créer un automate. Par exemple ta dernière proposition échoue avec une adresse en fin de phrase comme : « Il va falloir écrire à anadon.camille@dev.com. »

    Mais comme je le disais, tout dépend jusqu'à quel point on veut être capable de couvrir l'étendue des mails valides ; cela peut passer du simple ^[\w-\.]+@([\w-]+\.)+[\w-]{2,6}$ à un complexe (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]).

    Dans tous les cas, on construit le DFA associé à la regexp, l'implémentation ensuite devrait être assez aisée.
    La première proposition devrait couvrir la majorité des besoins «normaux». Un algo relativement simple est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1. on place un curseur au début du buffer
    2. on avance le curseur tant qu'il ne pointe pas un caractère étant une lettre, un point ou un tiret
    3. on marque un début de mail potentiel
    4. on avance le curseur tant qu'il pointe un caractère étant une lettre, un point ou un tiret
    5. si le curseur ne pointe pas sur un @ alors on démarque le début potentiel et on va en 2
    6. on avance le curseur tant qu'il pointe un caractère étant une lettre, un point ou un tiret
    7. on marque une fin de mail potentielle 
    8. on vérifie que la position du dernier . corresponde bien, éventuellement on checke que la dernière portion est un tld valide ; si tout est bon on émet la portion sinon on recommence en 2

  12. #12
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    679
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 679
    Par défaut
    Salut,

    Citation Envoyé par sedami95 Voir le message
    Merci pour votre intervention. Moi même, ça ne me plaît pas plus que ça. Je développe une application Windows sous Windev. Cet environnement fournit une fonction qui permet uniquement de vérifier si une chaîne de caractères respecte la condition d'une expression régulière ou pas. Ça ne va pas plus loin que ça.
    Pourtant la documentation de windev fait bien état d'une fonction RegexMatch() en mesure de faire le job.
    https://doc.windev.com/en-US/?1000026273
    https://doc.windev.com/en-US/?3024032
    https://doc.windev.com/en-US/?1000019746

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Merci beaucoup pour vos interventions. Anadoncamille, ta proposition me donne bien des idées.

    WhiteCrow, je vois maintenant beaucoup plus clair avec ton algorithme.

    C'est exactement ce que je souhaitais quand j'ai lancé ce sujet. Je crois avoir maintenant suffisamment d'éléments pour mettre sur pied mon programme. Je vous mets au courant de la méthode finale. Merci.

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Salut,



    Pourtant la documentation de windev fait bien état d'une fonction RegexMatch() en mesure de faire le job.
    https://doc.windev.com/en-US/?1000026273
    https://doc.windev.com/en-US/?3024032
    https://doc.windev.com/en-US/?1000019746
    Bonjour kaitlyn,
    RegexMatch(), effectivement ça pourrait bien faire le job. Je n'étais pas au courant de cette fonction avant aujourd'hui. Une petite recherche m'a permis de comprendre qu'elle n'a fait son apparition que dans la version 26. Je m'embête avec VerifieExpressionReguliere() dans la version 24 et ça le fait pas du tout (en tout cas pas sans magouilles avec les fonctions de traitement de chaînes).

  15. #15
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    679
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 679
    Par défaut
    Il y a plusieurs versions de cette fonction dont une est intéressante :

    Checking a format and retrieving the elements corresponding to the format in an array
    <Result> = MatchRegularExpression(<Element to check> , <Regular expression> , <Array of strings>)
    une chaine /regexp/g va normalement faire remplir le tableau donné en paramètre avec toutes les occurrences trouvées.

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Il y a plusieurs versions de cette fonction dont une est intéressante :



    une chaine /regexp/g va normalement faire remplir le tableau donné en paramètre avec toutes les occurrences trouvées.
    Merci kaitlyn. Peut-être que je m'y prends mal mais même cette version n'arrive pas à régler le problème. Dans mes recherches, je n'ai trouvé personne qui ait réussi à faire un truc pareil (avec cette fonction en windev). Il semblerait qu'une LST ait appréhendé le sujet (40 je crois). Dans l'exemple, PC Soft aurait morcelé la chaîne en des mots puis aurait vérifié si chaque mot vérifiait la syntaxe. Cette manière de faire ne suffirait pas à tout obtenir dans mon cas.

  17. #17
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 227
    Par défaut
    Dans mes recherches, je n'ai trouvé personne qui ait réussi à faire un truc pareil

    Euh ...
    Disons que tu n'as trouvé personne qui ait accepté de le faire pour toi.

    Un problème bien exposé est un problème à moitié résolu.
    Prenons cette chaine, que tu as toi même évoquée : <b>anadon.camille@dev.com</b>

    Dans cette chaine, il y a différentes adresses valides : anadon.camille@dev.com , nadon.camille@dev.com , adon.camille@dev.com

    Quel est ton besoin ?

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2016
    Messages : 54
    Par défaut
    Bonjour tbc92,

    Dans "<b>anadon.camille@dev.com</b>", j'aurais logiquement besoin de "anadon.camille@dev.com".

  19. #19
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut
    Quelques infos utiles se trouvent ici : https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique

  20. #20
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat mon.fichier.e-mail.txt
    Dans cette chaine, il y a différentes adresses valides : anadon.camille@dev.com , nadon.camille@dev.com , adon.camille@dev.com
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -Po '[\w-\.]+@([\w-]+\.)+[\w-]{2,6}' mon.fichier.e-mail.txt
    anadon.camille@dev.com
    nadon.camille@dev.com
    adon.camille@dev.com
    Tout marche très bien. Ceux qui t'ont répondu avant ont raison. RegexMatch() est l'équivalent de grep -Po ci-dessus et le tableau est rempli des solutions. Au travail !

Discussions similaires

  1. Afficher le nombre d’occurrences des mot d'un texte sans utiliser les collections
    Par Gabriel_Enriquezdu67 dans le forum Général Java
    Réponses: 8
    Dernier message: 07/11/2019, 17h10
  2. renommer des fichiers en utilisant les expression régulière
    Par yanndu92 dans le forum Général Python
    Réponses: 6
    Dernier message: 14/01/2019, 20h40
  3. Réponses: 9
    Dernier message: 23/07/2012, 17h00
  4. Update en utilisant les expressions régulières ?
    Par Christophe Charron dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/12/2008, 16h39
  5. Réponses: 6
    Dernier message: 14/12/2007, 23h26

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