RegEx, nom et prénom

Résolu
yinkoh Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
yinkoh Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,


Je souhaite faire une modification sur les chaines de nom & prénom sur le modèle suivant:

le nom ne doit pas contenir de double caractère spécial (Espace, tiret, ...)
le prénom doit avoir des tirets au lieu d'espace pour les noms composés
enfin la partie qui me pose soucis, je souhaite mettre en majuscule la première lettre de chaque nom/prénom composé.

Une âme charitable aurait-elle les connaissances en regex qui me font défaut ?

D'avance, merci.

A voir également:

2 réponses

heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
Salut,



Je pense que oui. Mais il me faudrait quelques précisions.

- Quel langage utilises-tu ? Perso , Python, mais les regex sont quasi identiques pour tous les langages et Python est tellement facile à lire que je donnes les codes en Python. Ça te va?

- qu'est ce que tu entends par "double caractère spécial" ? Qu'il n'y ait pas deux tirets qui se suivent, par exemple ? ou qu'il n'y ait pas deux tirets dans toute la chaîne ?

- d'après ceci:

« Je souhaite faire une modification sur les chaines de nom & prénom » , je conclus que ce qui doit être traité est une chaîne avec nom et prénom, c'est à dire qu'il n'y a pas à la chercher au milieu d'une chaîne plus longue. C'est bien ça ?

-- que signifie :

« le prénom doit avoir des tirets au lieu d'espace pour les noms composés » ?

C'est un remplacement des espaces par des tirets ? ou une vérification ? qu'il faut faire ?

Dans les deux cas, il y a une difficulté: comment reconnait on que des portions de chaînes sont des parties d'un prénom composé ou d'un nom ? Les noms peuvent aussi ëtre composés, et dans "pierre henri simon", par exemple, le prénom est-il "pierre" ou "pierre-henri" ?


Je reviens dans un moment avec un code.
0
heyquem Messages postés 759 Date d'inscription   Statut Membre Dernière intervention   131
 
import re  
from string import capitalize  

patdbl = re.compile('[^a-zA-Z ]{2,}')  

for ch in ('sybille dupont','jean   francois regis',  
           'isidore--parfait marechal',  
           'justine emma dingdong',  
           'jim     john whistel poot',  
           'edgar-firmin lavallee'):  
    if patdbl.search(ch):  
        print '* deux caracteres identiques successifs dans :  '+ch  
    else:  
        li = map(capitalize,ch.replace('-',' ').split())  
        res = '-'.join(li[0:-1]) + ' ' + li[-1]  
        print res



Résultat:

Sybille Dupont
Jean-Francois Regis
* deux caracteres identiques successifs dans :  isidore--parfait marechal
Justine-Emma Dingdong
Jim-John-Whistel Poot
Edgar-Firmin Lavallee




Avec la fonction capitalize() de Python, il n'y a pas besoin de beaucoup de regex. Il doit bien y avoir une capitalize() dans le langage que tu utilises.

ch.replace('-',' ') remplace un éventuel tiret par un blanc pour que split() sépare deux prénoms dans un prénom composé afin que les deux initiales des deux prénoms soient également mises en majuscules

Pour pouvoir faire quelque chose, j'ai aussi supposé que la chaîne traitée est toujours du format:
'un ou plusieurs prénoms' 'un seul nom'
d'où le li[0:-1])



C'est pas terrible comme code, il me manque de savoir ce que tu veux faire exactement.
0
yinkoh Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de ta réponse, j'utilise php et je veux traiter les noms & prénoms avant de les insérer dans une bdd avec mysql.

Le nom & le prénom sont récupérés au moyen de deux variables distinctes.

La fonction capitalize() n'existe pas en php mais je me la suis déjà crée.

Oui il s'agit bien d'un remplacement d'espace par des tirets.

Par caractère spécial j'entends effectivement tout ce qui n'est pas 'alpha'.
Je souhaite (après remplacement) ne pas avoir de double tiret par exemple.

Merci
0