Outils pour utilisateurs

Outils du site


tris_alpha

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
tris_alpha [2011/09/19 08:11]
tyrtamos
tris_alpha [2011/09/21 08:45] (Version actuelle)
tyrtamos
Ligne 311: Ligne 311:
 ==== Suppression des accents ==== ==== Suppression des accents ====
  
-On va créer une fonction de conversion:+On va utiliser le module unicodedata:
  
 <code python> <code python>
 +import unicodedata
 +
 def sansaccent(ch):​ def sansaccent(ch):​
     """​Supprime les accents sans changer la casse (majuscules et minuscules)"""​     """​Supprime les accents sans changer la casse (majuscules et minuscules)"""​
-    ​alpha1 ​u"​àÀâÂäÄåÅçÇéÉèÈêÊëËîÎïÏôÔöÖùÙûÛüÜÿŸ"​ +    ​chnorm ​unicodedata.normalize('​NFKD',​ unicode(ch)) 
-    ​alpha2 = u"aAaAaAaAcCeEeEeEeEiIiIoOoOuUuUuUyY" +    ​return ​u""​.join([c ​for c in chnorm if not unicodedata.combining(c)])
-    x = u""​ +
-    ​for i,c in enumerate(ch):​ +
-        k = alpha1.find(c) +
-        if k>=0: +
-            x += alpha2[k] +
-        else: +
-            x += c +
-    return x    ​+
 </​code>​ </​code>​
 +
 +Ce code est simple et fait très bien le travail, sauf sur un point: il remplace en plus les espaces insécables par des espaces normaux. ​
 +
 +Si vous voulez, comme moi, garder les espaces insécables,​ voilà comment vous pouvez écrire la fonction définitive:​
 +
 +<code python>
 +import unicodedata
 +
 +def sansaccent(ch):​
 +    """​Supprime les accents sans changer la casse (majuscules et minuscules)"""​
 +    r = u""​
 +    for car in unicode(ch):​
 +        if car==u"​\xA0":​
 +            r += car
 +        else:
 +            carnorm = unicodedata.normalize('​NFKD',​ car)
 +            r += carnorm[0]
 +    return r       
 +</​code> ​
 +
 +Comment ça marche? C'est très simple: ​
 +  * si car est un caractère accentué, par exemple car='​ê',​ unicodedata.normalize('​NFKD',​ car) renvoie les 2 caractères:​ '​e'​ et '​^'​. Le caractère sans accent est le 1er caractère de la liste, d'où le "r += carnorm[0]"​. ​
 +  * si car n'est pas caractère accentué, unicodedata.normalize('​NFKD',​ car) se contente de le renvoyer et "r += carnorm[0]"​ marche aussi.
  
 Exemple (avec la même chaine que précédemment):​ Exemple (avec la même chaine que précédemment):​
  
 <code python> <code python>
 +print chaine
 +aAàÀâÂäÄåÅæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJkKlLmMnNoOôÔöÖœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZ
 print sansaccent(chaine) print sansaccent(chaine)
 aAaAaAaAaAæÆbBcCcCdDeEeEeEeEeEfFgGhHiIiIiIjJkKlLmMnNoOoOoOœŒpPqQrRsStTuUuUuUuUvVwWxXyYyYzZ aAaAaAaAaAæÆbBcCcCdDeEeEeEeEeEfFgGhHiIiIiIjJkKlLmMnNoOoOoOœŒpPqQrRsStTuUuUuUuUvVwWxXyYyYzZ
 </​code>​ </​code>​
  
-Si on veut supprimer les accents seulement sur les majuscules, c'est facile aussi:+Si on veut supprimer les accents seulement sur les majuscules, c'est facile aussi, à condition d'​introduire une autre fonction du module unicodedataune fois obtenu le caractère non accentué comme précédemment,​ on teste ce caractère avec unicodedata.category(carnorm[0]). S'il renvoie "​Lu"​ (=Letter upercase), c'est une majuscule! Il suffit dans ce cas de renvoyer le caractère non accentué. Dans les autres cas, on renvoie le caractère d'​origine.
  
 <code python> <code python>
 def sansaccentmaj(ch):​ def sansaccentmaj(ch):​
-    """​Supprime les accents ​des majuscules ​uniquement"""​ +    """​Supprime les accents uniquement ​sur les majuscules"""​ 
-    ​alpha1 = u"​ÀÂÄÅÇÉÈÊËÎÏÔÖÙÛÜŸ"​ +    ​= u""​ 
-    alpha2 = u"​AAAACEEEEIIOOUUUY"​ +    for car in unicode(ch): 
-    x = u""​ +        ​if car==u"​\xA0"​
-    for i,c in enumerate(ch): +            ​+= car
-        ​alpha1.find(c) +
-        if k>=0+
-            ​+= alpha2[k]+
         else:         else:
-            ​+= c +            ​carnorm = unicodedata.normalize('​NFKD',​ car) 
-    return ​x    ​+            carcat = unicodedata.category(carnorm[0]) 
 +            if carcat==u'​Lu':​ 
 +                r += carnorm[0] 
 +            else: 
 +                r += car 
 +    return ​r       
 </​code>​ </​code>​
  
Ligne 355: Ligne 376:
  
 <code python> <code python>
 +print chaine
 +aAàÀâÂäÄåÅæÆbBcCçÇdDeEéÉèÈêÊëËfFgGhHiIîÎïÏjJkKlLmMnNoOôÔöÖœŒpPqQrRsStTuUùÙûÛüÜvVwWxXyYÿŸzZ
 print sansaccentmaj(chaine) print sansaccentmaj(chaine)
 aAàAâAäAåAæÆbBcCçCdDeEéEèEêEëEfFgGhHiIîIïIjJkKlLmMnNoOôOöOœŒpPqQrRsStTuUùUûUüUvVwWxXyYÿYzZ aAàAâAäAåAæÆbBcCçCdDeEéEèEêEëEfFgGhHiIîIïIjJkKlLmMnNoOôOöOœŒpPqQrRsStTuUùUûUüUvVwWxXyYÿYzZ
 </​code>​ </​code>​
  
 +Et, en ne changeant qu'un seul caractère dans la fonction précédente,​ on peut ne retirer les accents que dans les minuscules: il suffit de modifier la ligne %%"if carcat==u'​Lu':"​%% comme suit: %%"if carcat!=u'​Lu':"​%%. Mais je ne vois pas d'​application pratique...
 +
 +\\
 On peut dès lors dans les tri utiliser ces fonctions de correction seules ou combinées avec les précédentes. On peut dès lors dans les tri utiliser ces fonctions de correction seules ou combinées avec les précédentes.
  
-Par exemple: convertir en majuscules sans accent:+Par exemple: convertir en majuscules sans accent ​avant la comparaison:
  
 <code python> <code python>
tris_alpha.txt · Dernière modification: 2011/09/21 08:45 par tyrtamos