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

Langage Perl Discussion :

Besoin d'aide pour amélioration de regxp


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 43
    Points : 24
    Points
    24
    Par défaut Besoin d'aide pour amélioration de regxp
    J'ai le regxp suivant (attention aux yeux)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $result =~ /text\/html|application\/xhtml+xml|application\/msexcel
                           application\/msword|application\/pdf|application\/rtf
                           application\/x-javascript|application\/x-httpd-php
                           text\/rtf|text\/nux|application\/sxc|application\/sxw|
                           application\/sxd
                           application\/mdi|application\/x-httpd-asp
                           application\/x-httpd-aspx|application\/x-httpd-mspx
                           application\/x-httpd-cfm|application\/x-httpd-jthl
                           application\/x-httpd-pm/i
    Je cherche a l'améliorer, car il ralentit mon script

    Merci

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu sais que tu peux utiliser d'autres délimiteurs que "/" pour ta regex (à condition de bien mettre le m devant), pour le coup ça facilite nettement la relecture d'icelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $result =~ m<text/html|application/xhtml\+xml|application/msexcel|
                           application/msword|application/pdf|application/rtf|
                           application/x-javascript|application/x-httpd-php|
                           text/rtf|text/nux|application/sxc|application/sxw|
                           application/sxd|
                           application/mdi|application/x-httpd-asp|
                           application/x-httpd-aspx|application/x-httpd-mspx|
                           application/x-httpd-cfm|application/x-httpd-jthl|
                           application/x-httpd-pm>ix;
    Sinon pour améliorer ce genre de chose, il faut utiliser Regexp::Assemble qui devrait normalement factoriser un maximum (par exemple c'est du gachis de mettre plusieurs alternative qui commence par "application" parce que si le moteur échoue sur la première alternative il va devoir rematcher "application" sur la seconde alternative, il vaut mieux les regrouper, etc... Mais ça devient illisible et impossible à maintenir, donc autant laisser à un module le soin de gérer cette transformation, en plus là tu recompiles ta regex à chaque match alors qu'il y a des moyens pour éviter cette recompilation inutile, et ce sera le cas si tu utilises Regexp::Assemble).

    --
    Jedaï

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    voilà, je t'ai refais une regex et ça a l'air assez rapide, je sais pas ce que ça donnera pour toi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if ($chaine =~ /(text\/(html|rtf|nux)|
    application\/x-httpd-(aspx?|php|mspx|cfm|jthl|pm)|
    application\/(sx[dcw]|rtf|pdf|
    x-javascript|mdi|msword|msexcel|xhtml\+xml)
    )/i){
    	print "ok\n";	
    } else {
    	print "bof\n";
    }
    il fera deja moins de verificaton que la tienne. 3 verif essentielle!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    text\/(html|rtf|nux)
     
    application\/x-httpd-(aspx?|php|mspx|cfm|jthl|pm)
    et
    application\/(sx[dcw]|rtf|pdf|x-javascript|mdi|msword|msexcel|xhtml\+xml)
    le premier regarde s'il y a text/(suivi de html ou rtf ou nux)
    le 2eme regarde application/x-httpd- (suivi de aspx ou asp ou etc)
    le dernier application/ (suivi de sxd ou sxc ou sxw ou rtf etc)

    voilà!!!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 43
    Points : 24
    Points
    24
    Par défaut
    Heu regexp::assemble j'avais trouvé sa sur le forum



    use Regexp::Assemble;
    { # scope pour rendre $re 'statique'
    my $re;
    sub allow
    {
    if( not $re ) {
    my $r = Regexp::Assemble->new;
    $r->add( "\\.$_\$" ) for
    qw/ htm asp aspx nux mspx cfm html xhtml jhtml php php3
    php4 shtml jsp php4 php5 jpg jpeg png gif doc rtf pdf
    xls pm shtm
    /;
    $re = $r->re;
    }

    return grep { /$re/ } @_;
    }
    }

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    et ça marche????
    moi j'ai pas trop compris la doc de ce module! si quelqu'un a des exemple de scripts avec, je suis preneur !!!

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Evidemment que ça marche ! Il assemble les alternatives que tu lui donnes et il factorise au maximum, puis il te recrache la regex résultante. Il donne donc de meilleurs résultat qu'un humain pour une liste simple de beaucoup de mots. Surtout que dans ton cas Djibril, tu as oublié de faire en sorte que la Regex ne soit compilée qu'une fois, avec ton code elle sera recompilé à chaque fois qu'on l'utilise !
    Le script que tu as trouvé shinux marche très bien : il te suffit de remplacer la ligne avec add pour que allow() fasse ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    use Regexp::Assemble;
    { # scope pour rendre $re 'statique'
      my $re;
      sub allow
      {
        if( not $re ) {
          my $r = Regexp::Assemble->new;
          $r->add( qw<application/xhtml\+xml application/msexcel 
            application/msword application/pdf application/rtf 
            application/x-javascript application/x-httpd-php 
            text/rtf text/nux application/sxc application/sxw 
            application/sxd application/mdi application/x-httpd-asp 
            application/x-httpd-aspx application/x-httpd-mspx 
            application/x-httpd-cfm application/x-httpd-jthl 
            application/x-httpd-pm> );
          $re = $r->re;
        }
     
        return grep { /$re/ } @_;
      }
    }
    Si tu veux encore plus de performance, tu peux utiliser un Trie.

    --
    Jedaï

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 43
    Points : 24
    Points
    24
    Par défaut
    Si tu veux encore plus de performance, tu peux utiliser un Trie.
    Comment sa un trie ??


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    use Regexp::Assemble; 
    { # scope pour rendre $re 'statique' 
      my $re; 
      sub allow 
      { 
        if( not $re ) { 
          my $r = Regexp::Assemble->new; 
          $r->add( qw<application/xhtml\+xml application/msexcel 
            application/msword application/pdf application/rtf 
            application/x-javascript application/x-httpd-php 
            text/rtf text/nux application/sxc application/sxw 
            application/sxd application/mdi application/x-httpd-asp 
            application/x-httpd-aspx application/x-httpd-mspx 
            application/x-httpd-cfm application/x-httpd-jthl 
            application/x-httpd-pm> ); 
          $re = $r->re; 
        } 
     
        return grep { /$re/ } @_; 
      } 
    }

    Heu je sais je suis chiant mais comment faire pour que ce prog renvoie 1 si le mime fait partie de la liste et 0 dans le cas contraire

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 43
    Points : 24
    Points
    24
    Par défaut
    Me revoila avec mes regxp

    J'ai encore un prb de compréhension cette fois ci (et je suis pas blond) donc voila je cherche a récupérer des données dans un prog et dispatché les array obtenue a d'autre sous prog

    J'ai trouvé ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    my %dispatch = ( 
    map( { $_, 'data' } qw{ htm asp aspx nux mspx cfm html xhtml jhtml php php3 php4 shtml jsp php4 php5 pm } 
    ), 
    map( { $_, 'image' } qw{ jpg jpeg png gif } 
    ), 
    map( { $_, 'doc'} qw{ doc rtf pdf xls } 
    ), 
    );
     
     
    donc on push le fichier/adresse sur un des trois arrays contenu dans resultat selon son extension, et si l'extension est foireuse ou inconnu on le met dans le array $resultat{inconnu}. Pour parcourir 
     
     
    my @source = qw/ a.doc B.DOC, c.jpg, d.mp3 /; 
    my( %resultat ); 
     
    for my $s( @source ) { 
        my ($ext = $s) =~ s/^.*?\.([^.]+)$/lc $1/e; 
        push @{$resultat{$dispatch{$ext} || 'iconnu'}}, $s; 
    }
     
     
     
     
    for my $r (keys %resultat) { 
        print "$r\n"; 
        for my $adr( @{$resultat{$r}} ) { 
            print "\t$adr\n"; 
        } 
    }

    J'ai pas compris comment ont récupère les tableau et comment utiliser ce code dans un sous prog

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ton dernier post est d'une clarté boueuse à souhait...

    Sinon pour ce qui est de la question précédente, tu remarqueras que le bout de code qu'on t'a donné contient une seule fonction allow(), qui fait un grep() à la fin, il s'agit donc d'un filtre : tu lui donnes une liste de terme à filtrer, et elle ne te renvoie que ceux qui correspondent à ta regex (qui ici est équivalente à la regex que tu avais proposé initialement, mais en plus rapide). Tu peux donc l'utiliser comme test en ne faisant allow() que sur un seul élément : s'il est bon cela renverra une liste d'un élément qui est une valeur "vraie", tandis que s'il n'est pas bon, cela renverra une liste vide qui est "fausse".

    --
    Jedaï

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 43
    Points : 24
    Points
    24
    Par défaut
    Heu oui mon dernier poste n'est pas claire

    En fait comme tu sais $result contient le mime de chaque elément je voudrais que chanque type de fichier subisse un traitement spéciale tout ce qui est format web est envoyé vers le prog web() , les format bureautique vers bureau() et les images vers pictures()

    Voila un peut le fonctionnement

    -> Je regarde si mon mime est autorisé (avec le filtre)
    -> Si oui je regarde de quel type il est
    -> Si sont type est par exmple application/msword je l'envoie vers le programme aproprié comme sa bureau($lien);

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ok, donc tu veux faire exactement ce que fait le code ci-dessus... Voilà un template pré-maché, essaie de faire un effort la prochaine fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    use Regexp::Assemble;
    { # scope pour rendre $re 'statique'
      my $re;
      sub allow
      {
        if( not $re ) {
          my $r = Regexp::Assemble->new;
          $r->add( qw<application/xhtml\+xml application/msexcel
            application/msword application/pdf application/rtf
            application/x-javascript application/x-httpd-php
            text/rtf text/nux application/sxc application/sxw
            application/sxd application/mdi application/x-httpd-asp
            application/x-httpd-aspx application/x-httpd-mspx
            application/x-httpd-cfm application/x-httpd-jthl
            application/x-httpd-pm> );
          $re = $r->re;
        }
     
        return grep { /$re/ } @_;
      }
    }
     
    my %dispatch = (
    #là tu mets la liste des content-type qui sont traités par bureau()
    map( { $_, \&bureau } qw{ application/msword ... } 
    ),
    #là tu mets la liste des content-type qui sont traités par web()
    map( { $_, \&web } qw{ text/html ... }
    ),
    #là tu mets la liste des content-type qui sont traités par picture()
    map( { $_, \&picture } qw{ ... }
    ),
    );
     
    #$type contient le content-type du document dans $content
    my $content = "Ce truc est un machin";
    my $type = "machin";
     
    if( allow( $type ) ){
      &{ $dispatch{ $type } }( $content );
    }
     
     
    #les définitions de tes fonctions bureau(), web() et picture()
    sub bureau {
     
    }
     
    sub web {
     
    }
     
    sub picture {
     
    }
    Si tu veux encore plus de performance, tu peux utiliser un Trie.
    Comment sa un trie ??
    Un Trie est un arbre de lettres, on peut ranger des mots à l'intérieur, et vérifier ensuite si un mot y a été inséré. Il n'y a pas plus rapide théoriquement pour cette vérification. Evidemment un Trie fait sous Perl n'est pas extraordinairement performant, mais pour te donner une idée ma propre implémentation qui est juste un premier jet fait à l'occasion d'un Projet TIPE a des performances telles que l'insertion de 20000 mots de longueurs variées (mais représentative du langage naturel) prend à peine 1/4 de secondes, la recherche d'un mot se faisant en moins d'un centième de seconde, et on parle là seulement d'une implémentation en Perl non-optimisée ! Mais pour une faible quantité d'alternative comme dans ton cas, c'est sans doute redondant.

    --
    Jedaï

Discussions similaires

  1. [XL-2007] Besoin d'aide pour améliorer facture proforma
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/08/2014, 20h06
  2. [XL-2007] Besoin d'aide pour améliorer mon code copier-coller
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/07/2014, 16h14
  3. [XL-2007] Besoin d'aide pour améliorer ma facture
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/08/2012, 00h57
  4. [CV] Besoin d'aide pour améliorer mon cv
    Par Alain Defrance dans le forum CV
    Réponses: 14
    Dernier message: 29/04/2008, 00h04
  5. [RegEx] Besoin d'aide pour améliorer le résultat
    Par teen6517 dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2007, 08h43

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