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 :

aide sur expression régulière


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut aide sur expression régulière
    Bonjour,
    je veux recupérer les n mots proches de ($mysearch) si $mysearch contient n mots
    Par exemple si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $mysearch = fouille de données;
    $text =  toto tata titi data mining ( fouille de données);
     
    # $mysearch contient 3 mots donc je dois recupérer 3 mots avant la parenthèse 
    # ouvrante
    # je dois obtenir  @results =  ('mining', 'data mining', 'titi tata mining');
    # Voici une première regexp qui me permet de recupérer le premier mot 
    while ( $text =~ /(\w+)\s*\(\s*$mysearch\s*\)/ig ){
         push @results, $1;
    }
    Merci d'avance pour votre aide
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Tu dis "je dois récupérer <autant de mot que dans le motif de recherche>", et pourtant, le résultat attendu n'est pas ce que tu indiques, puisque tu souhaites récupérer le mot avant, les deux mots avant et trois mots avant.
    Si le résultat consiste en
    @results = ('titi', 'data', 'mining');
    ça te convient également ?

    Pour obtenir ce résultat, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my $mysearch = q(fouille du web);
    my $text =  q{toto tata titi data mining ( fouille du web)};
     
    my $nb_word = () = $mysearch =~ /\b(\w+)\b/g;
    print "nb_word to search: $nb_word\n";
     
    my @results = map { split /\s/ } $text =~ /((?:\w+\s+){$nb_word})\s*\(\s*$mysearch\s*\)/;
    print join ", ", map "[$_]", @results;
    D'abord, tu calcules le nombre de mot du motif, puis tu l'utilises comme quantifier de mot à chercher avant le motif. Pour finir, tu split la liste donnée en résultat de la recherche de pattern (map { split /\s*/ } ...).

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Il y a probablement plus concis, mais voici une manière qui fonctionne :

    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
    use strict;
    use warnings;
     
     
     
    my $mysearch = 'fouille du web';
    my $text =  'toto tata titi data mining ( fouille du web)';
     
    # nbr de mots à récupérer
    my $word_nb = () = $mysearch =~ /\w+/g;
     
     
    if ( $text =~ /([\s\w]+)\s*\(\s*$mysearch\s*\)/ig ){
     
         # récupération de tous les mots précédant la parenthèse
         my @word_list = split /\s+/, $1;
         my @results;
     
         # contient les derniers mots concaténés
         my $concat = '';
     
         for my $i (0..$word_nb-1){
     
    	# indice du mot de @word_list à traiter
    	my $ind = $#word_list - $i;
    	$concat = $word_list[$ind].' '.$concat;
     
    	push (@results,  $concat);
     
         }
    }

  4. #4
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Je ne comprend pas trop ta demande, en fait ton $myserach contenant 3 mots, tu veux récupérer 3 mots dans $text. Tu veux récupérer les 3 mots qui précédent la paranthèse ouvrante ou 3 mot au hazard avant ?

    Par ce dans ton exemple tu dis :
    je dois obtenir @results = ('mining', 'data mining', 'titi tata mining');
    Ce ne serait pas plutôt :
    je dois obtenir @results = ('mining', 'data mining', 'titi data mining');

    Je ferais comme ça :
    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
     
    use strict;
    use warnings;
     
    my @results =();
     
    my $un;
    my $deux;
    my $trois;
     
    my $mysearch = "fouille du web";
    my $text =  "toto tata titi data mining ( fouille du web)";
     
    # $mysearch contient 3 mots donc je dois recupérer 3 mots avant la parenthèse 
    # ouvrante
    # je dois obtenir  @results =  ('mining', 'data mining', 'titi data mining');
    # Voici une première regexp qui me permet de recupérer le premier mot 
    while ( $text =~ /(\w+)\s*(\w+)\s*(\w+)\s*\(\s*$mysearch\s*\)/ig ){
         $un = $1;
         $deux = $1." ".$2;
         $trois = $1." ".$2." ".$3;
         @results = ($un,$deux, $trois);
    }
    Ce qui donne pour @results :

    mining
    data mining
    titi data mining

    A+

  5. #5
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Excusez de m'être mal exprimé ...
    En fait, si $mysearch contient n mots, je dois recupérer n PHRASES à côtés de $mysearch sachant
    Si:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mysearch = "fouille de données";
    $text          = "toto tata titi data mining (fouille de données)";
    la phrase 1 contient le premier mot le plus proche de "fouille du web" -> 'mining'
    la phrase 2 contient les 2 seconds motss les plus proches -> 'data mining'
    la phrase 3 -> 'titi data mining';
    la phrase 4 -> 'tata titi data mining' ne m'interesse pas car elle contient plus de 3 mots

    Donc @results est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @results = ("mining","data mining","titi data mining");
    En espérant avoir été clair cette fois-ci
    Encore merci pour votre aide et votre attention.
    Je vais m'inspirer de vos codes pour essayer de trouver la solution.
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  6. #6
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Le code de Jasmine devrait fonctionner vu qu'il récupère les mots de $text en fonction du nombre de mots présent dans $mysearch.

  7. #7
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Si j'ai bien compris, tu as une série de phrases différentes ($text est l'exemple d'une de celles-ci) et tu veux récupérer celles contenant de 1 à 3 mots (pas plus) avant ta parenthèse. Est-ce bien ça?
    A moins que $text ne contiennent toutes les phrases séparées par des sauts de lignes, dans ce cas le code suivant ne fonctionnera pas et tu dois l'adapter.

    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
    use strict;
    use warnings;
     
     
    my $mysearch = 'fouille du web';
    my $text =  'titi data mining ( fouille du web)';
     
    # nbr de mots à récupérer
    my $word_nb = () = $mysearch =~ /\w+/g;
     
    my @results;
     
    # vérification que $text contienne bien de 1 à $word_nb mots
    if ( $text =~ /^((?:\s*\w+\s*){1,$word_nb})\s*\(\s*$mysearch\s*\)/ig ){
    	push @results, $1;
    }

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Suite aux explications complémentaires, il est possible d'adapter mon premier script ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $mysearch = q(fouille du web);
    my $text =  q{toto tata titi data mining ( fouille du web)};
     
    my $nb_word = () = $mysearch =~ /\b(\w+)\b/g;
    print "nb_word to search: $nb_word\n";
     
    my @results = map { $text =~ /((?:\w+\s*?){$_})\s+\(\s*$mysearch\s*\)/ } 1 .. $nb_word;
     
    print join ", ", map "[$_]", @results;
    exit 0;
    (testé et OK sur l'exemple fourni).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide sur expression Régulière PL
    Par Tonyryu dans le forum PL/SQL
    Réponses: 2
    Dernier message: 16/06/2010, 21h20
  2. Besoin d'aide sur expression régulière
    Par tafkap dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 02/02/2010, 16h59
  3. [RegEx] Aide sur expression régulière
    Par mosto dans le forum Langage
    Réponses: 1
    Dernier message: 18/03/2008, 10h58
  4. Aide sur expression Reguliere
    Par chaser_T dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2006, 15h19
  5. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48

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