N-PN White-Hat Project
chercher des sous-chaines dans une chaine et dans l'ordre - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages interprétés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=27)
+--- Sujet : chercher des sous-chaines dans une chaine et dans l'ordre (/showthread.php?tid=3600)



chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

bon dit comme ça c'est peut-être pas très parlant, j'ai :
- d'un coté la chaine STR = "titi toto coincoin bouzin gruik pouet toto bouzin gruik bouzin"
- de l'autre une liste/un tableau de mots ARRAY = "toto", "bouzin", "pouet"

je veux à chaque fois que dans STR on trouve un mot qui appartient à ARRAY effectuer une action, disons appeller la fonction FUNC(), le tout dans l'ordre de la chaine, c'est à dire à l'exécution ça doit donner un truc comme ça :

Code :
str = "titi toto coincoin bouzin gruik pouet toto bouzin gruik bouzin"
FUNC(toto)
FUNC(bouzin)
FUNC(pouet)
FUNC(toto)
FUNC(bouzin)
FUNC(bouzin)

si possible de manière élégante en Perl (parcequ'y a toujours moyen d'être élégant avec Perl), sinon au moins en pseudo-code

des idées ?


RE: chercher des sous-chaines dans une chaine et dans l'ordre - ark - 20-03-2014

Yop

En python, je ferrais un truc comme :
Code PYTHON :

str = "titi toto coincoin bouzin gruik pouet toto bouzin gruik bouzin"
arr = ["toto", "bouzin", "pouet"]

[func(x) for x in str.split() if x in arr]
 


Mais bon ça génère un tableau... x)


RE: chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

oui forcément en python ici y'a moyen de faire très simple Smile
mais pour le coup je le code en perl donc je peux pas astucer de la même façon qu'en python, je gère nettement moins le langage ;p


RE: chercher des sous-chaines dans une chaine et dans l'ordre - Junky - 20-03-2014

Un truc dans le genre:

Code PERL :

#!/usr/bin/perl
#

$gruik="toto titi plop";

@prout = split(/ /, $gruik);

foreach my $i (@prout) {
    print "FUNC($i)\n";
}

#########
Sortie
#########
FUNC(toto)
FUNC(titi)
FUNC(plop)

 


EDIT: hummm viens de m'appercevoir qu'il manque un truc... :/
Junky,


RE: chercher des sous-chaines dans une chaine et dans l'ordre - fr0g - 20-03-2014

En python (en restant sur du code "générique" vu que les tricks/fonctions sont pas forcément les mêmes en perl :$)

Code PYTHON :

def func(word):
    print "THE WORD IS : "+word

tab = ["toto", "lol", "tata"]

string = "poazeriutotoazpoetrilolpoazerirtataporize"

i = 0
case = 0
s_len = len(string)
t_len = len(tab)
while (i < s_len and case < t_len):
    j = i
    while ((j - i) < len(tab[case])):
        if (string[j] == tab[case][(j - i)]):
            j += 1
        else:
            break
    if ((j - i) == len(tab[case])):
        func(tab[case])
        case += 1
    i += 1
 


output :
Code :
██ [ ~ ] [ 16:12:46 ]
██ python gruik.py
THE WORD IS : toto
THE WORD IS : lol
THE WORD IS : tata



RE: chercher des sous-chaines dans une chaine et dans l'ordre - ark - 20-03-2014

Snorky: Bah tu les prend pas dans l'ordre de la chaine la :p

en se basant sur ton code, je dirais un truc du genre:
Code PERL :

#!/usr/bin/perl
#

$str="titi toto coincoin bouzin gruik pouet toto bouzin gruik bouzin";
@arr=("toto", "bouzin", "pouet");

foreach my $i (split(/ /, $str)) {
    foreach my $j (@arr) {
    if ($i eq $j) {
        print "FUNC($i)\n";
    }
    }
}
 



RE: chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

ok autant pour moi, disons que la chaine c'est pas :
Code :
"titi toto coincoin bouzin gruik pouet toto bouzin gruik bouzin"
mais :
Code :
"titi toto coincoin bouzin gruik pouet totobouzingruik bouzin"

c'est plus proche de ce que je cherche ^^


RE: chercher des sous-chaines dans une chaine et dans l'ordre - ark - 20-03-2014

Apparement, avec ta nouvelle chaine, le code suivant fonctionne:

Code PERL :

#!/usr/bin/perl

$str="titi toto coincoin bouzin gruik pouet totobouzingruik bouzin";
@arr=("toto", "bouzin", "pouet");

foreach my $i (split(/ /, $str)) {
    foreach my $j (@arr) {
    print "FUNC($j)\n" if ($i =~ $j);
    }
}
 



RE: chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

l'implementation naïve en Perl donnerait ça :
Code PERL :
#!/usr/bin/perl
use strict;
use warnings;

my $str="titi toto coincoin bouzin gruik pouet bouzintotogruik bouzin";
my @arr=("toto", "bouzin", "pouet");

print $str."\n";
for (my $i = 0; $i < length($str); $i++) {
        foreach my $j (@arr) {
                if (index (substr($str, $i, length($str)), $j) eq 0) {
                        print "FUNC($j)\n";
                        next;
                }
        }
}

Code :
titi toto coincoin bouzin gruik pouet bouzintotogruik bouzin
FUNC(toto)
FUNC(bouzin)
FUNC(pouet)
FUNC(bouzin)
FUNC(toto)
FUNC(bouzin)

si quelqu'un a une implémentation plus propre/astucieuse/perleuse je prends !


RE: chercher des sous-chaines dans une chaine et dans l'ordre - Booster2ooo - 20-03-2014

RegExp? Mais j'imagine que ça sera moins performant que la petite boucle


RE: chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

nop, sauf astuce utiliser les regex (via grep par exemple) ce sera pas une bonne idée ici, même pas tant pour la rapidité d'exécution mais ça risque d'être moins "précis"


RE: chercher des sous-chaines dans une chaine et dans l'ordre - gruik - 20-03-2014

je me doutais bien qu'il devait y avoir une solution qui troue le fion, et elle est d'un bon calibre :
Code PERL :
#!/usr/bin/perl
my $str="titi toto coincoin bouzin gruik pouet bouzintotogruik bouzin";
my @arr=("toto", "bouzin", "pouet");

print $str."\n";

sub FUNC { print "FUNC(".$_[0].")\n"; }
my $pattern = '('.join('|',@arr).')';
$str =~ s/$pattern/FUNC($1)/eg;

Code :
titi toto coincoin bouzin gruik pouet bouzintotogruik bouzin
FUNC(toto)
FUNC(bouzin)
FUNC(pouet)
FUNC(bouzin)
FUNC(toto)
FUNC(bouzin)

thx b0fh Wink


RE: chercher des sous-chaines dans une chaine et dans l'ordre - Booster2ooo - 21-03-2014

sexy Smile


RE: chercher des sous-chaines dans une chaine et dans l'ordre - b0fh - 21-03-2014

Y'a un problème potentiellement de taille: @arr ne peut pas contenir de métacaractères de regex, sinon ça explose. Une petite modification pour que ça soit moins dangereux:

Code PERL :
my $pattern = '('.join('|',map(quotemeta,@arr)).')';