[Perl] regex

[Résolu/Fermé]
Signaler
-
 Kyo -
Bonjour ici !

J'aurais aimé savoir s'il était possible en Perl de construire des expressions régulières de façon générique. Je m'explique :

J'ai par exemple la phrase "Bonjour le monde. Phrase2. Phrase3", que je split par .
puis je split à nouveau avec

my @tab = split(/\s+/, $phrase);

J'ai donc les mots de la phrase "Bonjour le monde" dans le tableau tab.

Je voulais savoir si on pouvait construire le regexp m/.{0,30?}?$tab[0].{0,30?}?$tab[1].{0,30?}?$tab[2]...{0,30?}?$tab[TAILLE_DU_TABLEAU]./ sachant que je compte faire une boucle pour passer à la phrase suivante c'est à dire phrase2, etc...

Voilà, je suis pas très clair mais si quelqu'un pouvait m'éclairer.

4 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

si tu diras ce que tu veux obtenir comme résultat final je pourrai peut être t'aider

Donne un exemple concret avec 2 phrases.
Merci
J'ai un texte T1 contenant n phrases. Chaques phrases contient un nombre de mots.

Je fais une découpe par phrase et pour chaque phrase je veux faire une recherche sur un autre texte T2 (détection de plagiat).

Par exemple j'ai la phrase : "Bonjour le monde"
que je mets dans le tableau @tab

La commande
m/$tab[0]\s$tab[1]\s$tab[2]/ me renvoie vraie ou faux si la phrase est dans T2.

Maintenant mon problème, c'est que souhaiterais automatiser le tout avec par exemple une boucle.
Je voudrais que cette dernière crée l'expression régulière de recherche.

Exemple :
J'ai

Phrase 1 : "Bonjour le monde"
Phrase 2 : "Hello world"
Phrase 3 : "Il fait beau aujourd'hui"

J'aurais donc respectivement comme expressions régulières de recherche associées
m/$tab[0]\s$tab[1]\s$tab[2]/
m/$tab[0]\s$tab[1]]/
m/$tab[0]\s$tab[1]\s$tab[2]\s$tab[3]/

On voit que les expressions varie en fonction de la taille du tableau.

J'avais pensé à une boucle du genre

... Boucle sur les phrases du texte

... On mets dans un tableau les mots de la phrase

... Boucle qui parcoure les phrases du texte T2 pour faire les comparaisons
On a donc $line qui contient une phrase de T2

my $res = "m/; En gros là c'est ce que je recherche au final

my $size = @tab;
for(my $i; $i < $size; $i++)
{
### Là c'est le prob en gros je veux un truc comme ça (j'écris pas trop en perl car je sais pas vraiment comment l'exprimer)

$res += '\s'.$size;

}

Générer une chaine de caractère qui a pour valeur ce que je veux n'est pas le prob. Là où ça se complique, c'est que je voudrais pouvoir lancer cette chaine de caractère en tant que ligne de commande perl (Expression régulière)

Par exemple là j'ai dans $res
"m/$tab[0]\s$tab[1]\s$tab[2]/"

Si je tape
$res ça ne lancera pas la commande d'expression régulière.

Je crois que je suis encore moins clair xD
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

voici un p'tit exemple pour voir comment tu peux construire un objet regex (est-il vraiment nécessaire?!)
lami20j@debserv:~/trash$ cat kyo.pl
#!/usr/bin/perl
use strict;use warnings;

my @phrase = split /\./,<DATA>;
my @plagiat = qx/cat text2/;
pop @phrase;

foreach my$e(@phrase){
  my @reg = split /\s+/,$e;
  my $regex_ = join " ", @reg;
  my $regex = qr{$regex_};
  print "*** $regex_ *** est un plagiat dans le fichier text2\n"
          if (grep { m/$regex/ } @plagiat);
}
__END__
Bonjour le monde.Hello world.Il fait beau aujourd'hui.
lami20j@debserv:~/trash$ cat text2
Il fait beau aujourd'hui.
Un autre text.

lami20j@debserv:~/trash$ perl kyo.pl
*** Il fait beau aujourd'hui *** est un plagiat dans le fichier text2


Salut, oui ça marche. En fait ce qui me manquait surtout c'est qr qui m'est bien utile. Je sais pas si la construction d'un objet regex m'est nécessaire mais ça me permet de savoir ce que je peux faire ou pas avec.

En tout cas merci bien pour ton aide.