Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

combiner RegExp et générateur

+1 vote

Je souhaite créer un générateur itérant sur une expression régulière retournant tous les possibles triés par ordre alphanumérique croissant sur n caractères.
Je partirais sur

maRegExp = "r[a-zA-Z0-9_]{1,n}"

après, c'est le noir total.
Des idées ?
Merci à vous !

demandé 7-Sep par miebozor (136 points)
edité 7-Sep par foxmask

3 Réponses

+3 votes
 
Meilleure réponse

Si j'ai bien compris, il s'agit d'avoir un mapping «à l'envers» de regex, c'est-à-dire à partir d'une regex avoir toutes les chaînes possibles.

C'est pas trivial.

Regarde du côté de exrex.

Une manière de répondre à ta question serait sorted(tuple(exrex.generate("r[a-zA-Z0-9_]{{1,{}}}".format(n)))).

Attention évidemment à ne pas mettre de matching sans limite (eg a*).

répondu 8-Sep par lucas (2,108 points)
sélectionné 17-Sep par miebozor
0 votes

Yes Lucas merci !! J'ai bien un générateur avec. Dans l'idée ça ferait un chouette composant dans un mini bruteforcer pas gourmand en ram

import exrex
def cG(n) :
    l = sorted(tuple(exrex.generate("[a-zA-Z0-9_é&è@!:/;,()=+°?§.]{{1,{}}}".format(n))))
    for i in l:
        yield i
if __name__ == '__main__':
    #avec une longueur de chaine de 4    
    a = cG(4)
    for b in a:
        print(b)
répondu 12-Sep par miebozor (136 points)

Dans ce cas, tu peux accepter ma réponse (coche verte).

Pour le générateur, ton implémentation actuelle est gourmande en RAM. Tu créé un tuple (que tu trie juste après) avec l'ensemble des chaînes créées par exrex.

Essaye de faire un mot de passe de 20 caractères pour te le prouver.

0 votes

Lucas, je crois avoir trouvé :
l est bien un générateur, pas besoin de trier, ça l'est déjà :

import exrex
def cG(n) :
    l = (exrex.generate("[a-zA-Z0-9_é&è@!:/;,()=+°?§.]{{1,{}}}".format(n)))
    for i in l:
       print(i)
répondu il y a 5 jours par miebozor (136 points)
...