Forum Programmation.perl Des regexps plus rapides !

Posté par  .
Étiquettes : aucune
0
24
août
2004
Bonjour,

Tout est dans le titre.
Dans mon cas, j'ai une chaîne qui contient du texte. A côté, j'ai un tableau rempli d'éléments (environ 100-200), dont certains contiennent du code d'expression régulière. L'objectif est de savoir, pour chaque élément du tableau, s'il est contenu dans la chaîne (et éventuellement de le renvoyer dans un autre tableau).

Ce que je fais, c'est un grep, du genre:
@nouveau_tableau = grep($ma_chaine =~ m/$_/, @mon_tableau);

J'ai essayé aussi avec un foreach.

Le problème, c'est que c'est pas trop rapide, d'autant plus que j'ai près d'une cinquantaine de chaînes à tester comme ça.

Quelqu'un aurait-il quelques trucs et astuces de derrière les fagots ?
  • # Je suppose qu'on parle de Perl ici...

    Posté par  . Évalué à 3.

    J'ai du mal à comprendre tes problèmes de performance... Les regexp sont très compliquées, les chaines très longues, tu effectues le traitement de nombreuses fois ?

    Il y a toujours la solution de trier les regexp si tu cherches simplement 1 match (de la plus probable à la moins probable).

    Sinon, une autre solution est de générer dynamiquement le code de tes regexp avec l'option /o, tu peux jeter un oeil à http://iis1.cps.unizar.es/Oreilly/perl/cookbook/ch06_11.htm(...) par exemple pour plus d'informations.
    • [^] # Re: Je suppose qu'on parle de Perl ici...

      Posté par  . Évalué à 2.

      Oui, on parle bien de Perl, puisque c'est le forum Programmation Perl :-)

      Le problème de performance vient du fait de la répétition des recherches (à vu de nez, environ 20 000 recherches par lancement...gloups...).

      Trier les regexps ne m'est pas utile, ton lien l'est beaucoup plus (même si /o ne sera pas utile, car je change à chaque fois de pattern).

      Merci.
  • # regexp

    Posté par  (site web personnel) . Évalué à 1.

    @regexp = ( qr/toto/, qr/t.t./, qr/^.{4}$/, );


    for my $chaine ( qw( tototo titi toto ) ) {

    print join( " + ", $chaine, ( grep { $chaine =~ $_ } @regexp ), "\n" );

    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.