[Perl] regex
Résolu
Kyo
-
Kyo -
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.
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.
A voir également:
- [Perl] regex
- Denon perl pro test - Accueil - Audio
- Regex buddy - Télécharger - Édition & Programmation
- Active perl - Télécharger - Édition & Programmation
- Regex tout sauf - Forum Java
- Regex ne commence pas par ✓ - Forum Programmation
4 réponses
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
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
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
Salut,
voici un p'tit exemple pour voir comment tu peux construire un objet regex (est-il vraiment nécessaire?!)
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