Méthode qui ajoute un charactère tous les X charactères

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

J'ai créé une simple classe qui génère des codes d'activation aléatoirement. J'essaye de la compléter un peu et je bloque totalement là. Voici mon code pour le moment :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import random, string

class Generator:
    def __init__(self, separator = '-'):
        self.keys = []
        self.separator = separator

    def generate(self, length, number):
        chars = string.letters + string.digits
        for i in range(number):
            self.keys.append("".join([random.choice(chars) for j in range(length)]))

    def separate(self, each = 4):
        for key in self.keys:
            print(key) # Je ne vois pas trop comment faire ici...

if __name__ == '__main__':
    gen = Generator()
    gen.generate(15, 200)
    gen.separate()

    filekeys=file("activation_codes.txt",'w')
    for key in gen.keys:
        filekeys.write(str(key)+'\n')
    filekeys.close()

Peut être que ma POO n'est pas parfaite (sûrement même) si c'est le cas n'hésitez pas à me corriger. J'hésite notamment sur le fait que separator soit un attribut de la classe ou un argument de fonction. Donc ma méthode separate() doit ajouter un caractère dans mes codes tous les X caractères.

Voici à quoi ressemble un code : fR2Haf5MbAfAdBAqy6rfMaCfU et je voudrais obtenir quelque chose comme ça : fR2H-af5M-bAfA-dBAq-y6rf-MaCf-U

J'avoue que je ne vois absolument pas comment coder ça sachant que la longueur des codes est variable et que l'emplacement du séparateur aussi.. Rien n'est fixe !

Merci de votre aide et bonne journée.

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0

Pourquoi ne pas générer directement la clé avec les séparateurs ?

1
2
3
4
5
6
7
8
>>> def gen_key(nblocks, blocksize, separator='-'):
...     return separator.join(
...         ''.join( random.choice(CHAR)  for _ in range(blocksize) )
...         for _ in range(nblocks)
...     )
... 
>>> gen_key(5, 5)
'wP8xg-evrOR-G1any-E5BnP-rq6Pa'
+2 -0
Auteur du sujet

Merci @victor! Je n'avais pas encore abordé les expressions régulières !

@psycopy, car il se pourrait que j'ai besoin d'un code sans séparateur! ;)

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0

Dans la doc du module itertools, on trouve ce recipe :

1
2
3
4
5
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

A partir de là, il est possible de faire ceci :

1
2
def foo(code, n=4):
    return '-'.join(map(''.join, (grouper(code, n, ''))))

EDIT : j'ai beaucoup aimé la solution de victor, on peut juste simplifier en :

1
"-".join(re.findall("(?s).{1,4}", a))

Édité par yoch

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte