Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 27 August 2014 19:40

Zebulon_29
Juste Inscrit !
Date d'inscription: 21 May 2014
Messages: 6

Cherche expression en Python - Majuscule / Minuscule

Bonjour,

Je suis à la recherche d'une expression en Python qui me permette de changer du texte en minuscule tout en gardant la première lettre en majuscule, avec des exceptions pour des mots tels que : de - la - du etc... qui doivent être en minuscule

Pourquoi cela ?

Je récupère des données de différentes personnes. Un champs contient des données saisis en majuscule ou en minuscule. Je veux pouvoir alimenter un nouveau champs avec ces données, mais en appliquant la règle :

Je bascule tout en majuscule ou en minuscule pour tout avoir à l'identique
et ensuite j'uniformise en :

1ère lettre en majuscule le reste en minuscule
Exception : de - la - du - etc...

Pour l'instant, j'utilise plusieurs étapes car mes connaissances en python sont très réduites.

Si quelqu'un peut m'aider, merci d'avance

Hors ligne

 

#2 Wed 27 August 2014 23:42

ph.dubois
Juste Inscrit !
Date d'inscription: 21 Nov 2011
Messages: 3

Re: Cherche expression en Python - Majuscule / Minuscule

Bonjour,

En utilisant la calculatrice de valeurs de champs vous pouvez mettre dans le bloc de code Script Pre-Logic ceci :

Code:

list_out = ["le", "la", "de", "du"]

def Capit(string):
   return  ' '.join(word.lower().capitalize() if (word.lower() not in list_out) else word.lower() for word in string.split(' '))

Et appeler la fonction dans l'encart de calcul du champ :

Code:

Capit(!MonChamp!)

Petite explication : la liste "list_out" contient les mots que vous souhaitez laisser en minuscule. La chaine de caractère est découpée par ses espaces (des traits d'union dans les noms pourraient poser problème) puis chaque mot est mis en minuscule. S'il est présent dans la liste il est laissé tel quel sinon sa première lettre est mise en majuscule.

Vous pourrez trouver de la documentation intéressante sur les listes en intention et sur les méthodes de chaines telles que .capitalize() ou .title()

Bien cordialement,
ph

Hors ligne

 

#3 Thu 28 August 2014 20:42

Zebulon_29
Juste Inscrit !
Date d'inscription: 21 May 2014
Messages: 6

Re: Cherche expression en Python - Majuscule / Minuscule

Merci, j'ai pu avoir un bon résultat pour 80 % de mes données.

Il me reste à corriger le cas du tiret du 6 (exemple : Menez-Hom devient Menez-hom), le cas du d' et l' (exemple : L'etoile au lieu de l'Etoile) et enfin des cas spécifiques données à ne pas modifier (exemple : RN120 doit rester ainsi ou ZAC)

Je me demande si je peux envisager de faire une première condition :

- Si j'ai un apostrophe derrière un "l" ou un "d" je mets obligatoirement une majuscule sur la lettre qui suit et le "l" et le "d" reste en minuscule

Suivi d'une 2ème condition pour les données non concernées par la 1ère condition :

- Si j'ai un tiret, la lettre qui suit doit-être en majuscule

Suivi d'une 3ème condition pour les données non concernées par la 1ère et la 2ème condition:

- Pour des mots définis que je mets dans une liste (list_out) ZAC, RD, etc... Je les laisse en majuscule (est-ce que je peux avoir plusieurs listes d'exclusion, répondant à des critères différents ?).

Enfin pour les données ne répondant pas à ces 3 conditions j'applique le code :

Code:

list_out = ["le", "la", "de", "du"]

def Capit(string):
   return  ' '.join(word.lower().capitalize() if (word.lower() not in list_out) else word.lower() for word in string.split(' '))
====
Code:

Capit(!MonChamp!)

====

Merci d'avance

Hors ligne

 

#4 Fri 29 August 2014 00:54

ph.dubois
Juste Inscrit !
Date d'inscription: 21 Nov 2011
Messages: 3

Re: Cherche expression en Python - Majuscule / Minuscule

Oui, vos conditions semblent bonnes, ils suffit de les prioriser en fonction de vos besoins. Pour ma part j'ai fait comme suit :

1- traitement des mots devant être en minuscule (prépositions)
2- traitement des mots contenant une apostrophe (avec gestion de la préposition en début de nom et de traits d'unions dans le nom)
3- traitement des mots contenant un trait d'union
4- traitement des mots avec un préfixe devant être en majuscule (RN notamment)
5- traitement par défaut (première lettre en majuscule)


Voici le script traduit :

Code:

listeMinuscule = ["le", "la", "de", "du"]
listMajuscule = ["RN", "ZAC", "ETC"]

def Capit(chaine):
    # Separation de la chaine par les espaces
    listeMot = chaine.split(' ')
    for i in range(0,len(listeMot)):
        mot = listeMot[i]
        
        # Si le mot est dans la liste des minuscules
        if mot in listeMinuscule :
            listeMot[i] = mot.lower()
            
        # Sinon, si le mot contient une apostrophe
        elif "'" in mot :
            # Si le mot est en debut de nom alors la lettre precedant l apostrophe doit etre en majuscule
            if i == 0:
                listeMot[i] = mot.title()
            # Sinon la lettre precedant l apostrophe est en minuscule, les autres en majuscule
            else :
                motSplit = mot.split("'")
                # Condition permettant de verifier qu il n y avait bien qu une apostrophe
                if len(motSplit) == 2:
                    motSplit[0] = motSplit[0].lower()
                    # L utilisation de title() ici permet de gerer les mots post-apostrophe avec un tiret
                    motSplit[1] = motSplit[1].title()
                    listeMot[i] = "'".join(motSplit)
       
       # Sinon, si le mot contient un tiret
        elif '-' in mot :
            listeMot[i] = mot.title()
        
        # Sinon, si le mot contient un element de la liste upper il est mis en majuscule, sinon seulement sa premiere lettre
        else:
            # Si le mot passe en majuscule debute par un element de la liste, le mot est mis en majuscule
            up = False
            for el in listMajuscule:
                if mot.upper().startswith(el):
                    listeMot[i] = mot.upper()
                    up = True
            # Enfin, si le mot est passe a travers toutes les conditions sa premiere lettre est mise en majuscule
            if not up:
                listeMot[i] = mot.capitalize()
    return ' '.join(listeMot)

Hors ligne

 

#5 Fri 29 August 2014 19:06

Zebulon_29
Juste Inscrit !
Date d'inscription: 21 May 2014
Messages: 6

Re: Cherche expression en Python - Majuscule / Minuscule

Merci pour tout, ça m'aide beaucoup.

Hors ligne

 

#6 Fri 06 November 2015 16:59

LE HIR
Participant occasionnel
Date d'inscription: 27 Oct 2013
Messages: 21

Re: Cherche expression en Python - Majuscule / Minuscule

Bonjour,

Je viens d'utiliser le code dans un nouveau model builder.

Ci-dessous les corrections que l'on a apporté pour le faire fonctionner :

listeMinuscule = ["le", "la", "de", "du"]

et devenu

listeMinuscule = ["Le", "La","Les", "De","Des", "Du"]

Il me reste un problème pour lequel j'ai besoin d'aide.

Si l'adresse a à la fois des mots de la "listeMinuscule" en minuscules et d'autre en majuscules, il ne traite pas tout pour avoir tout en minuscule

Exemple :

Corniche de l'Aber wrac'H De La
devient :
Corniche De l'Aber wrac'H de la

Par contre si j'ai
Corniche De l'Aber wrac'H De La
alors ça devient
Corniche de l'Aber wrac'H de la
Ce qui répond à mon besoin.

Si quelqu'un sait le bout de code qu'il me manque.

Merci d'avance

Hors ligne

 

#7 Sat 07 November 2015 09:25

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: Cherche expression en Python - Majuscule / Minuscule

Bonjour,

Le script de ph.dubois fonctionne si tous les mots de listeMinuscule sont en minuscule dans la chaine de départ.
Une méthode, pour cela fonctionne comme tu veux, est de mettre tout la chaîne de départ en minuscule en ajoutant au début de la fonction :

Code:

chaine = chaine.lower()

Le script modifié :

Code:

listeMinuscule = ["le", "la", "les", "de", "des", "du"]
listMajuscule = ["RN", "ZAC", "ETC"]

def Capit(chaine):
    # Tous les mots de la chaine doivent etre en minuscule
    chaine = chaine.lower()

    # Separation de la chaine par les espaces
    listeMot = chaine.split(' ')
    for i in range(0, len(listeMot)):
        mot = listeMot[i]

        # Si le mot est dans la liste des minuscules
        if mot in listeMinuscule:
            listeMot[i] = mot.lower()

        # Sinon, si le mot contient une apostrophe
        elif "'" in mot:
            # Si le mot est en debut de nom
            # alors la lettre precedant l apostrophe doit etre en majuscule
            if i == 0:
                listeMot[i] = mot.title()
            # Sinon la lettre precedant l apostrophe est en minuscule,
            # les autres en majuscule
            else:
                motSplit = mot.split("'")
                # Condition permettant de verifier qu il n y avait bien
                # qu une apostrophe
                if len(motSplit) == 2:
                    motSplit[0] = motSplit[0].lower()
                    # L utilisation de title() ici permet de gerer
                    # les mots post-apostrophe avec un tiret
                    motSplit[1] = motSplit[1].title()
                    listeMot[i] = "'".join(motSplit)

       # Sinon, si le mot contient un tiret
        elif '-' in mot:
            listeMot[i] = mot.title()

        # Sinon, si le mot contient un element de la liste upper
        # il est mis en majuscule, sinon seulement sa premiere lettre
        else:
            # Si le mot passe en majuscule debute par un element de la liste,
            # le mot est mis en majuscule
            up = False
            for el in listMajuscule:
                if mot.upper().startswith(el):
                    listeMot[i] = mot.upper()
                    up = True
            # Enfin, si le mot est passe a travers toutes les conditions
            # sa premiere lettre est mise en majuscule
            if not up:
                listeMot[i] = mot.capitalize()
    return ' '.join(listeMot)

On obtient comme prévu : Corniche De l'Aber wrac'H De La => Corniche de l'Aber wrac'H de la

A+

Franck

Hors ligne

 

#8 Sat 07 November 2015 13:28

LE HIR
Participant occasionnel
Date d'inscription: 27 Oct 2013
Messages: 21

Re: Cherche expression en Python - Majuscule / Minuscule

Ok
Je fais le test à mon retour dans une semaine.
Merci pour ton aide

Hors ligne

 

Pied de page des forums

Powered by FluxBB