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

Le problème exposé dans ce sujet a été résolu.

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.

+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'

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))
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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