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 :

Récupérer des données qui se suivent avec une RegEx


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 73
    Points : 54
    Points
    54
    Par défaut Récupérer des données qui se suivent avec une RegEx
    Bonjour,

    Voici le contenu que je souhaite analyser :

    | + Track
    |  + Track number: 3 (track ID for mkvmerge & mkvextract: 2)
    |  + Track UID: 208241622015289522
    |  + Track type: audio
    |  + Default track flag: 0
    |  + Codec ID: A_AC3
    |  + Default duration: 00:00:00.032000000 (31.250 frames/fields per second for a video track)
    |  + Audio track
    |   + Sampling frequency: 48000.0
    |   + Channels: 6
    | + Track
    |  + Track number: 4 (track ID for mkvmerge & mkvextract: 3)
    |  + Track UID: 17276059575939532984
    |  + Track type: subtitles
    |  + Default track flag: 0
    |  + Forced track flag: 1
    |  + Lacing flag: 0
    |  + Codec ID: S_TEXT/UTF8
    |  + Language: fre
    |  + Name: forced
    | + Track
    |  + Track number: 5 (track ID for mkvmerge & mkvextract: 4)
    |  + Track UID: 16661143567665435554
    |  + Track type: subtitles
    |  + Default track flag: 0
    |  + Lacing flag: 0
    |  + Codec ID: S_TEXT/UTF8
    Je souhaite obtenir un tableau avec trois entrées :

    | + Track
    |  + Track number: 3 (track ID for mkvmerge & mkvextract: 2)
    |  + Track UID: 208241622015289522
    |  + Track type: audio
    |  + Default track flag: 0
    |  + Codec ID: A_AC3
    |  + Default duration: 00:00:00.032000000 (31.250 frames/fields per second for a video track)
    |  + Audio track
    |   + Sampling frequency: 48000.0
    |   + Channels: 6
    
    | + Track
    |  + Track number: 4 (track ID for mkvmerge & mkvextract: 3)
    |  + Track UID: 17276059575939532984
    |  + Track type: subtitles
    |  + Default track flag: 0
    |  + Forced track flag: 1
    |  + Lacing flag: 0
    |  + Codec ID: S_TEXT/UTF8
    |  + Language: fre
    |  + Name: forced
    
    | + Track
    |  + Track number: 5 (track ID for mkvmerge & mkvextract: 4)
    |  + Track UID: 16661143567665435554
    |  + Track type: subtitles
    |  + Default track flag: 0
    |  + Lacing flag: 0
    |  + Codec ID: S_TEXT/UTF8
    Pour obtenir ce résultat, je pourrais bidouiller en ajoutant un | + Track à mon texte d'origine puis en utilisant la RegEx '(?s) Track\R(.*?)\R\| \+'.

    Mais j'aimerai savoir comment faire sans. ;-)

  2. #2
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Voici un script en raku, je n'ai pas réussi à le traduire en perl5.
    Il nécessite un retour de ligne en fin de fichier.

    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
    #!/usr/bin/env perl6
    use v6;
     
    my $track="| + Track
    |  + Track number: 3 (track ID for mkvmerge & mkvextract: 2)
    |  + Track UID: 208241622015289522 
    |  + Audio track
    |   + Sampling frequency: 48000.0
    |   + Channels: 6
    | + Track
    |  + Track number: 4 (track ID for mkvmerge & mkvextract: 3)
    |  + Track UID: 17276059575939532984
    | + Track
    |  + Track number: 5 (track ID for mkvmerge & mkvextract: 4)
    |  + Track UID: 16661143567665435554
    |  + Codec ID: S_TEXT/UTF8
    "; 
     
    repeat {
        $track ~~ s/("| + Track\n" ("| " " "+ .*? \n)*)//;
        say "$0"; 
    } while $track;
    j'ai essayé ça, et des variantes sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $track =~ s/(\| + Track\n(\|  +.*?\n)*)//;
    Maintenant, en quoi est-ce vraiment utile de garder "| + Track"dans le résultat ?

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En mode slurp (tout le contenu du fichier dans une variable), tu peux splitter en utilisant: \n\|( ++).*+\K\n(?!\|\1).

    L'idée est de scinder la chaîne à la nouvelle ligne lorsque la ligne suivante contient moins d'espaces d'indentation après la barre verticale.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre habitué

    Homme Profil pro
    Statisticien
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 134
    Points
    134
    Par défaut
    30 minutes pour comprendre, j'ai encore beaucoup à apprendre :-)
    Bon,
    Je ne connaissais pas \K, ni ?!, comme quoi, je devrais lire un peu plus.
    Par contre, je ne comprends pas pourquoi il faut mettre \1, plus exactement pourquoi $1 ne fonctionne pas.

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Une référence au contenu d'une capture dans la pattern même se fait toujours avec \n (où n est le numéro du groupe). Il existe une syntaxe alternative venant d'oniguruma (moteur utilisé dans les anciennes versions de Ruby, maintenant il utilise le fork onigmo) : \g{n}. Cette deuxième syntaxe permet aussi de se référer à un groupe de capture de manière relative: \g{-2} (deuxième groupe à gauche de la position actuelle). $n s'utilise hors de la pattern.

    À noter aussi que \1 est définie dés que la capture a eu lieu, alors que la variable $1 n'a d'existence que si la pattern a réussi.




    Pour la pattern précédente autant capturer la barre, c'est plus court: \n(\| ++).*+\K\n(?!\1)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [XL-2016] Récupérer des données sur le web avec une API GET
    Par GroFlo dans le forum Excel
    Réponses: 0
    Dernier message: 06/05/2019, 22h49
  2. Réponses: 2
    Dernier message: 22/12/2008, 18h29
  3. Réponses: 4
    Dernier message: 14/01/2008, 00h15
  4. Réponses: 9
    Dernier message: 04/04/2007, 11h16

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