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 :

Spliter une valeur selon des mots spécifiques


Sujet :

Langage Perl

  1. #1
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut Spliter une valeur selon des mots spécifiques
    Salut,

    J'essaie de spliter une valeur du genre "C4 PIC SX PK 1,6 HDIC4PICASSO 5 PL"
    le mot PICASSO peut etre aussi "CITROEN", "CLMBERLINGO" ou "BERLINGO"
    je commence d'abord juste pour tester par le mot "PICASSO" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     use strict;
       use warnings;
     
       my $test="C4 PIC SX PK 1,6 HDIC4PICASSO 5 PL";
       if($test=~/([^PICASSO]*)(^PICASSO)/){
                                 print " $1  ;  $2 ";
                                            }
    je galere pour trouver la bonne regexp.

    merci pour votre intervention

    ++

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Où est le rapport entre ton split et l'expression régulière? Que dois-tu récupérer exactement? Uniqueme le mot clé?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($test =~ /(PICASSO|CITROEN|CLMBERLINGO|BERLINGO)/){
        print $1;
    }

  3. #3
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Où est le rapport entre ton split et l'expression régulière? Que dois-tu récupérer exactement? Uniqueme le mot clé?
    A partir de cette chaine "C4 PIC SX PK 1,6 HDIC4PICASSO 5 PL"
    je veux avoir comme résultat une première chaine : $1="C4 PIC SX PK 1,6 HDIC4" et une deuxième : $1="PICASSO 5 PL"
    La chaine que je veux séparer peut etre aussi du genre :
    "C2 X 1.1 E CITROEN C2"
    ou "BERLINGO FAM. 2P CLMBERLINGO CKD VP"
    ou "C4 PIC SX PK 1,6 HDIC4PICASSO 5 PL"
    je veux séparer ces valeurs avec une seule expression réguliere pour avoir le résultat :
    premiere chaine : "C2 X 1.1 E " deuxième chaine "CITROEN C2"
    premiere chaine : "BERLINGO FAM. 2P CLM" deuxième chaine "BERLINGO CKD VP"
    première chaine : "C4 PIC SX PK 1,6 HDIC4" deuxième chaine "PICASSO 5 PL"
    le CLMBERLINGO n'existe pas -_-', j'ai confondu avec le mot BERLINGO
    (quel fichier totalement altéré)
    pour les espaces entre ces deux chaines, ça peut exister comme ça ne peut pas l'être.

    La description du regexp que je veux faire, c'est donc :
    pour la première chaine : une chaine que ça peut contenir tout les caractères y compris parfois le mot que j'utilise pour differencier la deuxième chaine.
    la deuxième chaine doit contenir une chaine qui commence toujours par un de ces trois mots : CITROEN, BERLINGO ou PICASSO.

    voilà, je travaille sur autre chose en attendant des interventions utiles ^^

    ty

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/^(..*)((?:PICASSO|CITROEN|BERLINGO).*)$/
    --
    Jedaï

  5. #5
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m/^(..*)((?:PICASSO|CITROEN|BERLINGO).*)$/
    --
    Jedaï
    J'adore ta réponse Jedaï même pas un mot, mais une seule ligne qui résout tout, merci beaucoup.

    Mais j'aimerai bien que tu m'expliques même si je sais que ^(..*) donne tout les caractères existant sur la chaine, des chiffres ou des lettres, je ne comprends pas le fait que ça ne comprend pas la deuxième chaine.

    et dans la deuxième chaine le ?: je ne comprends son utilité?

    Merci

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((?:PICASSO|CITROEN|BERLINGO).*)
    Tu vas récupérer dans $2 ce qui est contenu entre les parenthèses rouges.
    Tu utilises les parenthèses bleues internes aux rouges afin de pouvoir utiliser la condition 'ou' (choix1|choix2|choix3)
    ?: se rapportent aux parenthèses bleues et signifie que tu ne récupères pas leur contenu.

    Est-ce clair?

    Par contre, (..*) je ne connais pas, j'aurais utilisé (.*) ou (.+)
    ... peut-être est-ce une faute de frappe ou est-ce égal à (.+) et que cela signifie donc n'importe quel caractère au moins une fois.

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    (.+) est mieux effectivement... (complètement équivalent)

    --
    Jedaï

  8. #8
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    ?: se rapportent aux parenthèses bleues et signifie que tu ne récupères pas leur contenu.

    Est-ce clair?
    nop ce n'est pas clair,dis donc c'est sérieux cette phrase , parce que soit je ne comprends rien, soit c'est n'importe quoi lol
    que veux tu dire avec le contenu ? est ce "PICASSO","CITROEN" et "BERLINGO", parce que ça je veux le récupérer, le point d'interrogation c'est clair à quoi sert, mais les deux points ":" ?

    j'aimerai bien lire un doc, mais je ne suis pas sure de pouvoir trouver un lien exact pour avoir une explication pour ce ptit détail.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    En d'autres termes, malgré le fait que tu aies 3 couples de parenthèses, seuls $1 et $2 existeront et $3 n'existera pas grâce à ce ?:


    que veux tu dire avec le contenu ? est ce "PICASSO","CITROEN" et "BERLINGO", parce que ça je veux le récupérer,
    Vu que les parenthèses rouges encadrent les bleues, tu récupèreras indirectement le contenu des parenthèses bleues.


    le point d'interrogation c'est clair à quoi sert, mais les deux points ":" ?
    Et si tu n'as pas compris les : c'est que tu n'as pas non plus compris le ? car ils vont ensemble.


    ... plus clair que cela, je ne vois pas.

  10. #10
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Bonjour Jasmine,

    Tout d'abord j'aimerais te remercier infiniment pour toutes tes interventions.

    Je ne vais pas dire que je n'ai rien compris avec tes explications, ni que j'ai tout compris

    Le souci c'est que j'avais eu besoin du même motif, et voilà que je reviens au même thread, mais avec le même problème
    Cette fois j'essaie de faire, un split sur un champ durée qui peut avoir une format h:mm:ss ou bien mm:ss, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $duree="3:55:30";
         $duree=~m/((?:\d).*):(\d\d):(\d\d)/;  
      print "H : ".$1 ." M : ".$2." S : ".$3."\n";
    Avec ça c'est bon, mais si j'omets l'heure, ça me renvoit en effet rien, pas de $1, ni de $2, ni de $3


    @+

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Que cherche tu as faire exactement? Est-ce le fait que l'heure puisse avoir 1 ou 2 chiffres qui t'ennuie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $duree=~m/(\d\d?):(\d\d):(\d\d)/;
    Avec ça c'est bon, mais si j'omets l'heure, ça me renvoit en effet rien, pas de $1, ni de $2, ni de $3
    Est-ce ce que tu veux? ou veux-tu qu'il soit possible ne pas indiquer l'heure?

  12. #12
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Que cherche tu as faire exactement? Est-ce le fait que l'heure puisse avoir 1 ou 2 chiffres qui t'ennuie?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $duree=~m/(\d\d?):(\d\d):(\d\d)/;
    Non, le format du time n'est pas un problème, avec 1 ou 2 chiffres, je peux controler ça.

    Citation Envoyé par Jasmine80 Voir le message
    Est-ce ce que tu veux? ou veux-tu qu'il soit possible ne pas indiquer l'heure?
    Voilà c'est ce que je veux, sur les données à traiter, il y en a avec le format h:mm:ss et d'autres avec le format mm:ss, donc ceux avec une heure renseignée et ceux avec heure pas renseigner.
    C'était clair pourtant, j'ai l'impression de répéter la même chose pour la deuxième fois, encore un effort et je ferais la même chose que celui qui expliquait le même message qui était clair, plus de 5 fois, en croyant qu'il n'était pas assez clair

    ++

  13. #13
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       my $duree="6:55:30";
       $duree=~m/((\d*)?:?)(\d\d):(\d\d)/;
       print "A => ".$1 ."\n H => ".$2."\n M => ".$3."\n S => ".$4."\n";
    J'aurais un résultat A qui ne sert à rien, mais bon ça renvoit "6:", et aussi bien le reste H et M et S.

    Merci Jasmine

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       my $duree = "55:30";
       if($duree=~m/^(\d\d?):(\d\d):(\d\d)$/){
    	print "H : ".$1 ." M : ".$2." S : ".$3."\n";
       }
       elsif($duree=~m/^(\d\d):(\d\d)$/){
    	print "M : ".$1." S : ".$2."\n";
       }

  15. #15
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Bon, c'est plus propre comme ça.

    Merci Jasmine

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    De rien n'oublie pas de clore ce sujet si tu n'as plus de questions.

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

Discussions similaires

  1. [Débutant] Géneration d'une liste des valeurs selon des criteres
    Par mdimagho dans le forum MATLAB
    Réponses: 8
    Dernier message: 26/05/2015, 18h41
  2. Réponses: 2
    Dernier message: 28/07/2010, 14h51
  3. modifier une valeur dans des variables
    Par bombjack91 dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/06/2007, 08h14
  4. [VB-Excel]Trier une valeur comprennant des lettres et des chiffres
    Par DomBourti dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2006, 21h51
  5. Réponses: 2
    Dernier message: 16/05/2006, 17h02

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