IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Induction d'expressions régulières


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut Induction d'expressions régulières
    Bonjour,

    Je cherche un algo capable, à partir de plusieurs chaines de caractères, de générer une expression régulière qui valide ces chaines et/ou de mettre à jour une expression régulière à partir d'une nouvelle chaine de caractères.

    Exemples simples :
    chaine "aaabb" et chaine "abc" génèrent l'expression "a+b+c?"
    chaine "bbc" et expression "a+b+c?" génèrent l'expression "a*b+c?"

    Auriez-vous des éléments de réponse qui puissent m'aider (je devrai, par la suite, implémenter cela en php) ?

    Merci pour ce forum très enrichissant,

    Fabrisss

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Salut,

    Le problème AMHA c'est qu'il existe une infinité de solutions à ton problème, dont certaines triviales (il suffit de faire un ou entre toutes les entrées par exemple). Si tu n'impose pas de contraintes à tes expressions rationnelles je ne vois pas comment s'en sortir

  3. #3
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    pourrais-tu préciser un peu la grammaire que tu veux implémenter? Désolé, mais tes 2 exemples ne sont pas clairs pour moi!
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Certes, j'admets que mon problème est encore un peu flou.

    L'objectif est de trouver une grammaire commune (sous la forme d'une expression régulière) à un ensemble de chaines de caractères. Cette grammaire doit être la plus spécifique possible tout en factorisant les éléments communs. Trouver une grammaire la plus générique est en effet assez trivial : ".*" convient dans tous les cas ;-)

    Je conviens donc que mes exemples ne sont pas pertinents.
    chaine "aaabb" et chaine "abc" devraient plutôt donner l'expression "a{1-3}b{1-2}c?"

    En espérant être plus clair ? Toute référence est la bienvenue.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Comme l'a dis sovitec, le choix est infini, et s'étend plus précisément de "u1|u2|...|un" à ".*"

    la "plus petite" (dans le sens du language généré) expression régulière étant la simple disjonction des chaines en entrée. Et la "plus grande", etant le filtre tout.

    Et, faire un compromis est une tâche bien ardue, et reviendrais à établir un ordre bien fondé (voir totale) (beacoup plus fin que la simple inclusion des languages associés) sur la structure des expressions régulières. Et plus précisément dans ton cas de construire un treillis complet.

    C'est possible (à rapprocher avec les méthodes de simplification des expressions dans les outils de calcul formel), mais trés long à réaliser. C'est comme écrire un compilateur à l'envers.

    Je te souhaite bon courage pour la réalisation de ce projet de grande envergure. et voilà un lien qui te permettra d'avoir une base formelle afin d'y parvenir :

    http://www.lix.polytechnique.fr/Labo...%20libre%22%22

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Il y a dans cette article un exemple complet de simplification (sur lequel tu peut te baser, pour faire ton algorithme)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Merci pour cette référence; je vais tenter de me plonger la dedans mais ça me semble bien complexe...enfin, si c'est le prix à payer... :-(

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    En vérité, ça fais peur à voir parce que ça touche la logique. Et c'est toujours un peu dure à saisire. du coup il emploi tout un vocabulaire plus ou moins obscure tournant autour de la logique (en particlier des systèmes de réecriture).
    Mais l'idée essentielle est assez simple à retenir, utiliser des règles inductifs (récursif dans les cas de paramètres entier) pour résoudre le problème.

    Pour ton cas, et pour t'orienter un peu. Cela se traduira tous bonnement par le choix des règles
    - de factorisation (prefixes et sufixes communs)
    - de généralisation (quand est-ce qu'on généralise avec l'étoile "*")
    - de restriction (le langage est trop gros que dois-je enlever)

    et toute les autres règles (heuristique ou exacte) plus subtile qui ne rentre pas dans une des ces catégories. toute les règles doivent garder une cohérence d'echelle afin de pouvoir garantir la terminaison de l'algo.

    Une bonne connaissance du contexte d'application est en générale nécéssaire. Par exemple si le langage initiale est issue d'une grammaire hors contexte, Il sera beaucoup plus simple de trouver des bonnes factorisations. Parce que tu connais déjà les schémas (les calques) que tu peut appliquer. C'est en cela que je faisais le rapprochement avec un décompilateur (en entrée on a le code assembleur, et la grammaire du langage et en sortie un code "source" qui correspond)

    En tous cas n'hésite pas à posé des questions. Je serais ravis de t'aider à comprendre ne serais-ce qu'un tout petit peu, les concepts qui sont cachés derrières.

Discussions similaires

  1. [RegEx] Expression régulières : Balises <SCRIPT>
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2006, 23h25
  2. Expression réguliére
    Par Mad_Max dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 16/09/2003, 18h17
  3. [expression régulière] mon cerveau fait des noeuds..
    Par nawac dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/05/2003, 10h06
  4. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo