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 :

Nettoyage de noms avec RE


Sujet :

Python

  1. #1
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut Nettoyage de noms avec RE
    Bonjour à tous,

    Je cherche présentement à "nettoyer" deux listes de noms dont le formatage est différent, afin de pouvoir créer une liste unique de correspondance.
    Concrètement, voici des exemples de formatage:

    Table 1 Table 2 résultat attendu
    Bob_Leponge Leponge, Bob leponge_bob
    Marie-Pier_Josee Jose, MariePier josee_marie-pier
    Justin_De-L'Arbre De L'Arbre, Justin de-l'arbre, Justin

    Pour info, j'ai intégré le "résultat attendu" de manière purement arbitraire. L'idéal est avant tout de pouvoir séparer les noms et prénoms (facile), puis de reformater chacun d'eux.

    À moins qu'une solution plus efficace existe, j'ai pensé à réaliser ce reformatage par RegEx (via la bibliothèque RE). Cependant, je débute à peine sur les RegEx et j'ai encore un peu du mal à saisir les paterns à employer.
    Aussi, bien que le fait de n'utiliser qu'un seul patern serait idéal, j'ai la possibilité de traiter les deux tables indifféremment, donc possibilité d'employer plusieurs paterns.

    Pour le moment, voici ce que j'ai essayé (trouvé durant la rédaction de ce post):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re 
    pattern = re.compile(r"([A-Z][^A-Z\-\s]*)")
    Qui fonctionne bien, sauf pour le dernier à cause de l'apostrophe. En effet, ceci me sépare le "L'" de "Arbre" ce qui est problématique lors du l'appel à '-'.join(pattern.findall(input)).
    Sauriez-vous m'indiquer dans quelle mesure je peux modifier mon regex afin que ce dernier ne sépare pas majuscules séparées d'un apostrophe ( "AbcD"["Abc", "D"], mais "L'AbcD"["L'Abc", "D"]) ?

    Je vous remercie par avance de votre expertise et savoir faire, qui me seront fort utile dans l'automatisation des tâches que j'entreprends.
    Bonne journée !

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    en intercalant un groupe non-capturant optionnel on arrive bien à ce que tu veux avec "L'AbcD" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.findall(r"([A-Z](?:\'[A-Z])?[^A-Z\-\s]*)", "L'AbcD")
    ["L'Abc", 'D']
    mais en l'état ça n'est pas généralisable aux autres exemples que tu montres, il doit falloir raffiner ou donner des exemples plus précis.

  3. #3
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut
    Salut, Merci pour cette réactivité.

    J'ai fait le test et tout semble correct de mon côté ;
    Voici la fonction utilisé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
    pattern = re.compile(r"([A-Z](?:\'[A-Z])?[^A-Z\-\s]*)")
    def process_name(input):
        if ", " in input:
            x, y = input.split(", ")
        else:
            y, x = input.split("_")
     
        first = '-'.join(pattern.findall(y)).lower()
        last = '-'.join(pattern.findall(x)).lower()
     
        return last, first
     
    for v in names:  
        grp = process_name(v)
        print(grp)
    Il me reste à essayer de l'appliquer sur l'ensemble de mes listes pour un test plus probant, mais sur une 10 d'entrées prises au hasard, ça semble bien fonctionner (incluant les apostrophes).

    Merci encore donc. Je ferais savoir si je rencontre des spécificités différentes. Je dois me perfectionner sur le langage RegEx aussi

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    C'est bien de vouloir le "mieux" mais quand même la différence entre vos chaines de caractères c'est "nom_prenom" et "prenom, nom".

    Vous avez plutôt intérêt à trouver une forme "canonique", par exemple le tuple (prénom, nom) et comparer les variants à ce tuple "canonique".

    Après, le rendu de (prénom, nom) en "prénom_nom" ou "nom, prénom", c'est juste une transformation en chaine de caractères pour les humains.

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

  5. #5
    Membre actif Avatar de BioKore
    Homme Profil pro
    Dresseur d'Alpaga
    Inscrit en
    Septembre 2016
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Dresseur d'Alpaga

    Informations forums :
    Inscription : Septembre 2016
    Messages : 300
    Points : 219
    Points
    219
    Par défaut
    Bonjour,

    Je n'ai pas vraiment de problèmes avec la forme "nom_prénom" ou "prénom, nom". Comme tu le vois d'ailleurs dans ma précédente fonction, les first et last représentent justement le tuple (prénom, nom). Globalement, un split fait l'affaire.
    Le vrai problème que j'avais étais plus de l'ordre technique, visant à trouver un moyen de dire que "Pré-NomS" == "Prénoms" == "PréNoms".

    Et il est vrai que plusieurs solutions s'offrent à cette question. Passer par un RegEx me semble être intéressant car offre, dans le cas présent, la possibilité de traiter les noms/prénoms composés à ma guise.

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

Discussions similaires

  1. Raccourci pour nom avec formattage
    Par jackrabbit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/09/2006, 22h31
  2. [PHP-JS] Problème avec les noms avec apostrophes
    Par cyberdevelopment dans le forum Langage
    Réponses: 10
    Dernier message: 07/08/2006, 14h35
  3. [MySQL] Problème avec les noms avec espaces
    Par cyberdevelopment dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/08/2006, 13h16
  4. Nettoyage de disque avec Windows 2000 Professional
    Par vautour29 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 15/10/2005, 02h19
  5. conflit de nom avec perlembed et winsock2
    Par clochette dans le forum MFC
    Réponses: 10
    Dernier message: 21/06/2005, 14h42

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