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 :

expression reguliere perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Par défaut expression reguliere perl
    Bonjour

    étant donné un fichier texte comme suit:
    num_video: 2 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 7 - note: 8 - prfrg - age: 49 - pratique: non - duree: non
    num_video: 12 - note: 8 - fgft - age: 27 - pratique: oui - duree: oui
    num_video: 15 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 14 - note: 9 - MddB - age: 30 - pratique: oui - duree: oui
    num_video: 17 - note: 8 - MddB - age: 30 - pratique: oui - duree: oui
    num_video: 18 - note: 9 - MddB - age: 30 - pratique: oui - duree: oui
    Je voudrais extraire les deux premier nombre (num_video et note), j'ai essayé cette expression et ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ( $num, $note) = $ligne =~ /num_video\s*:\s*(\d+)\s*-\s*note\s*:\s*(\d+)/;
    Je voudrais également extraire la chaine de caractère qui vient juste après la note (sans tiret) exemple : fgt , MddB ...
    J'ai essayé cette expression , et ca ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ( $name) = $ligne =~ /num_video\s*:\s*\d+\s*-\s*note\s*:\s*\d+\s*-\s*(\s+)\s*-/;
    Pouvez vous me dire c'est ou exactement le problème?

    Merci

  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
    Pourtant, ton expression régulière devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ perl -E 'my $ligne = qq(num_video: 2 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui); my ( $num, $note, $name) = $ligne =~ /num_video\s*:\s*(\d+)\s*-\s*note\s*:\s*(\d+)\s*-\s*(.*?)\s/; say "num=$num, note=$note, name=$name";'
    num=2, note=9, name=fgt

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Par défaut
    La tienne marche parfaitement

    il suffit donc de remplacer (\s+) par (.*?)

    Merci Philou67430

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Par défaut
    Est ce possible de compter le nombre de noms apparus dans le fichier et le nombre d'apparition de chacun?

    Dans notre cas le résultat sera

    nombre de noms = 3
    fgt 3 fois
    prfrg 1 fois
    MddB 3 fois

    Merci d'avance

  5. #5
    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
    Citation Envoyé par devhercule Voir le message
    La tienne marche parfaitement

    il suffit donc de remplacer (\s+) par (.*?)

    Merci Philou67430
    Pour l'extraction de $name, oui.
    Mais ta première expression régulière qui récupérais $num et $note fonctionnait parfaitement.

    Pour ce qui est de .*? : elle permet de récupérer n'importe quel caractère, jusqu'à ce que l'on trouve la suite le l'expression régulière (qui est \s), soit un espace.
    Si l'on avait mis .* l'expression aurait récupérer aussi longtemps que possible jusqu'au dernier espace.

    Et bien sûr qu'il est possible de compte les apparitions des noms : utilise un hashage avec comme clé le nom (et comme valeur le nombre d'occurrence).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Par défaut
    Je débute avec Perl.. peux tu stp me guider un peu plus, un petit code si possible, je pourrai le comprendre et l’améliorer par la suite

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 87
    Par défaut
    Le code suivant rempli un tableau avec les nom apparus dans le fichier data.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl
    use strict;
    use warnings;
     
     
    my $file = 'data.txt';
    open my $fh, "<", $file or die "can't open < $file: $!";
     
    my %tab;
     
    while (my $ligne = <$fh>) {
        my ( $name ) = $ligne =~  /num_video\s*:\s*\d+\s*-\s*note\s*:\s*\d+\s*-\s*(.*?)\s/;				
        push @{$tab{$name}}, $name;
    }
    Le fichier data.txt est
    num_video: 2 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 7 - note: 8 - prfrg - age: 49 - pratique: non - duree: non
    num_video: 12 - note: 8 - fgft - age: 27 - pratique: oui - duree: oui
    num_video: 15 - note: 9 - fgt - age: 27 - pratique: oui - duree: oui
    num_video: 14 - note: 9 - MddB - age: 30 - pratique: oui - duree: oui
    num_video: 17 - note: 8 - MddB - age: 30 - pratique: oui - duree: oui
    num_video: 18 - note: 9 - MddB - age: 30 - pratique: oui - duree: oui
    Je veux bien modifier mon code pour afficher combien j'ai de noms dans mon fichier.

    Dans ce cas resultat=4

    Merci d'avance

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

Discussions similaires

  1. expression reguliere perl
    Par rahon dans le forum Langage
    Réponses: 5
    Dernier message: 11/07/2012, 09h29
  2. expression reguliere perl
    Par rahon dans le forum Programmation et administration système
    Réponses: 3
    Dernier message: 09/07/2012, 21h00
  3. Ecrire une expression reguliere en Perl
    Par moniphal dans le forum Langage
    Réponses: 11
    Dernier message: 10/11/2008, 11h54
  4. [langage] Ptit Probleme expression réguliere avec perl
    Par Shoot Again dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2004, 12h44
  5. [langage] Pb PERL : expressions regulières
    Par alexcluzel dans le forum Langage
    Réponses: 5
    Dernier message: 12/11/2004, 14h13

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