Accueil Forum -> Techno Geek -> Programmation  >>  [Python] Formatage de caractères dans une boucle (et non pas de chaines de caractères)
1 messages
Accueil Forum -> Techno Geek -> Programmation  >>  [Python] Formatage de caractères dans une boucle (et non pas de chaines de caractères)
1 messages

[Python] Formatage de caractères dans une boucle (et non pas de chaines de caractères)

09 février 2016 à 16:16 MetalTux    
Salut

Je fais en ce moment un peu de Python 3 histoire de faire la main, j'en suis à la manipulation de caractères
J'ai fait un script à la con qui convertit du texte en leetspeak et inversement, en utilisant un dictionnaire, avec en clés des caractères alphabétiques majuscules et en valeurs leurs équivalents en leetspeak, voici mon script

[table][tr][td]
#!/usr/bin/env python3
# -*-coding:utf-8 -*-

leetdict={"A":"4", "B":"8", "C":"(", "D":"d", "E":"3", "F":"f", "G":"6", "H":"#",
 "I":"1", "J":"j", "K":"k", "L":"l", "M":"m", "N":"n", "O":"0", "P":"p", "Q":"q",
 "R":"2", "S":"5", "T":"7", "U":"u", "V":"v", "W":"w", "X":"x", "Y":"y", "Z":"z"}

inmsg = input("_Input: ")
msg = inmsg.upper()
pos = 0
print("Result", end=": ")
while pos < len(inmsg):
    if msg[pos] in [' ', ',',"'", '.', '?', '!', '-', ':', '/']:
        print (msg[pos], end='')
    for char,leet in leetdict.items():
        if char==msg[pos]:
            print(leet, end="")
        elif leet==inmsg[pos]:
            print(char, end="")
    pos = pos + 1
print("\n")
# print(inmsg, end="\n") # Me sert juste débugger, en vérifiant que inmsg, contrairement à msg, contient bien des minuscules tout au long du programme, donc des caractères présents dans les valeurs (leetspeak) du dico, c'est bien le cas
[/td][/tr][/table]

La conversion dans les deux sens fonctionne sauf que si l'utilisateur entre son texte en leetspeak, j'ai un formatage foireux en sortie :
Les caractères leetspeak chiffres ou des symboles sont substituer en tant que caractère alphabétique correspondant en majuscules, alors les caractères leetspeak minuscules sont substitués par… des minuscules dans la sortie, voici un exemple

[table][tr][td]7#3 qu1(k 820wn f0x jump5 0v32 7#3 l4zy d06! y34#, n0? 30l.
THE quICk BROwn fOx jumpS OvER THE lAzy dOG! yEAH, nO? EOl.[/td][/tr][/table]

Le seul moyen que j'ai trouvé pour harmoniser la sortie, c'est de tout afficher en minuscules avec print(char.lower, end="") mais c'est pas ce que je veux, je cherche à vaoir soit
— La ligne commençant par une majuscule, comme avec str.capitalize()
— Chaque mot commençant par une majuscule, comme avec str.title()
— Tout en majuscules, comme avec str.upper(), histoire d'être en cohérence avec le contenu des clés de mon dico, même si c'est visuellement craignos

Mais ces fonctions sont prévues pour des chaînes de caractères, du coup ça fait pas ce que je veux pour des caractères qui s'affichent un par un dans une boucle…

À partir du moment ou j'essaie de mettre des majuscules, ou que ce soit, dans ma sortie, quelque soit la méthode que j'ai testé, et que le texte entré est en leetspeak, je me retrouve avec une sortie ayant des majuscules uniquement là ou la valeur (leet) est un caractère non-alphabetique, alors que là ou la valeur est minuscule, la clé (char) retournée reste en minuscule. Même si je passe tout en misnicule avant, dans une autre variable, et que j'affiche cette variable après l'avoir passé dans une des trois fonctions str.* cités plus haut…

Comment sortir de ce casse-tête sans devoir par un code usine à gaz ? si possible

IMPORTANT : mon objectif est de garder un code aussi compact que possible, donc je cherche volontairement à éviter de créer boucles à tout va, de créer un autre dictionnaire en inversant le contenu des clés et des valeurs, de faire 36 variables, pour tout bien séparer en demandant à l'utilisateur quelle opérateur il veut effectuer dès le lancement du script, ce qui contribue à me faire galérer un peu plus, mais je sais pas dans quelle mesure je peux atteindre mon objectif avec cette contrainte


Edité par MetalTux