Indexer les parenthèses d'une chaine de caractère.

Résolu
Benjamin-BioInfo -  
 Benjamin-BioInfo -
Bonjour à tous.

Dans le cadre d'un projet je souhaiterai traiter des chaines du type:

((((A,B):100,C):98,(D,E):50,F):84,G)

et donc associer chaque parenthèse ouvrante "(" à la parenthèse fermante correspondant ")", le tout en perl.

Mon idée première fut de splitter la chaine, puis de dire:
Si tu vois une "(", alors tu ajoutes un au compteur et compteur= numéro de la parenthèse"("
Si tu vois une ")", alors tu enlèves un au compteur et compteur= numéro de la parenthèse")"

Cependant dés que deux parenthèses se suivent comme ceci: ..)...(... je suis coincé.

Si quelqu'un a une idée, ou pourrait m'orienter vers un lien, ça serait super!

Merci à vous!

2 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Benjamin,

    Avec le module CPAN Text::Balanced, tu peux faire cela en quelques lignes de code.

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use Data::Dumper;
    use Text::Balanced qw (extract_bracketed);
    
    my $st = "((((A,B):100,C):98,(D,E):50,F):84,G)";
    
    while ($st =~ /\(/g) {
        my ($extracted, $remainder) =
            extract_bracketed(substr($st, $-[0]), '(');
        if (defined($extracted)) {
            print "extracted: $extracted\n";
        }
    }
    


    cela donne :

    extracted: ((((A,B):100,C):98,(D,E):50,F):84,G)
    extracted: (((A,B):100,C):98,(D,E):50,F)
    extracted: ((A,B):100,C)
    extracted: (A,B)
    extracted: (D,E)

    Vois la doc du module pour gérer les erreurs de parsing.

    Dal
    0
  2. Benjamin-BioInfo
     
    Wow... super!!

    Merci beaucoup, j'ai bossé dessus tout l'après-midi et j'ai finalement réussi à faire ça en... 50 lignes de codes, 3 tableaux de hash... bref une galère pour un code vraiment pas beau ^^'

    En tout cas merci beaucoup pour ton aide, je m'en vais tester ce nouveau code immédiatement!

    A plus :)
    0