Indexer les parenthèses d'une chaine de caractère. [Résolu/Fermé]

Signaler
-
 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

Messages postés
5550
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
12 mai 2021
934
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

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 :)