From biz at joueb.com Mon Dec 18 10:41:27 2017 From: biz at joueb.com (=?UTF-8?Q?St=c3=a9phane_Gigandet?=) Date: Mon, 18 Dec 2017 10:41:27 +0100 Subject: [Perl] =?utf-8?q?Module_pour_parser_des_parenth=C3=A8ses_imbriqu?= =?utf-8?q?=C3=A9es?= Message-ID: Bonjour, Pour Open Food Facts j'essaie de parser des listes d'ingrédients qui ressemblent à ça : "farine (12%), chocolat (beurre de cacao (15%), sucre [10%], protéines de lait, oeuf 1%) - émulsifiants : E463, E432 et E472 - correcteurs d'acidité : E322/E333 E474-E475, acidifiant (acide citrique, acide phosphorique) - sel" Que j'essaie de transformer en arbre comme : [     {ingredient=>'farine', percent => 12},     [ingredient=>'chocolat', ingredients => [         {ingredient:'beurre de cacao', percent=>15},         {ingredient:'sucre', percent=>10},         {ingredient:'protéines de lait'},         {ingredient:'oeuf', percent=>1},     ]},     {ingredient=>'émulsifiants', ingredients => [         {ingredient=>'E463'},         {ingredient=>'E432'},         {ingredient=>'E472'},     ]}, ... Pour l'instant j'ai du code à base de regexp avec une fonction récursive, mais c'est très laid et ça marche pas très bien : https://github.com/openfoodfacts/openfoodfacts-server/blob/master/lib/ProductOpener/Ingredients.pm#L251 Je suis sûr qu'il y a des modules qui peuvent faire ce genre de trucs très bien, vous en connaissez ? Merci beaucoup, Stéphane From laurent.dami at justice.ge.ch Mon Dec 18 10:58:36 2017 From: laurent.dami at justice.ge.ch (Dami Laurent (PJ)) Date: Mon, 18 Dec 2017 09:58:36 +0000 Subject: [Perl] =?iso-8859-1?q?Module_pour_parser_des_parenth=E8ses_imbriq?= =?iso-8859-1?q?u=E9es?= In-Reply-To: References: Message-ID: Salut, Tu peux définir une grammaire complète avec https://metacpan.org/pod/Regexp::Grammars , mais ça demande un investissement non négligeable pour l'apprentissage. Sinon s'il ne s'agit que de paires de parenthèses, il y a https://metacpan.org/pod/Regexp::Common::balanced ou https://metacpan.org/pod/Text::Balanced Bon travail, Laurent Dami -----Message d'origine----- De : perl-bounces at mongueurs.net [mailto:perl-bounces at mongueurs.net] De la part de Stéphane Gigandet Envoyé : lundi 18 décembre 2017 10:41 À : Liste francophone pour les questions générales sur Perl Objet : [Perl] Module pour parser des parenthèses imbriquées Bonjour, Pour Open Food Facts j'essaie de parser des listes d'ingrédients qui ressemblent à ça : "farine (12%), chocolat (beurre de cacao (15%), sucre [10%], protéines de lait, oeuf 1%) - émulsifiants : E463, E432 et E472 - correcteurs d'acidité : E322/E333 E474-E475, acidifiant (acide citrique, acide phosphorique) - sel" Que j'essaie de transformer en arbre comme : [     {ingredient=>'farine', percent => 12},     [ingredient=>'chocolat', ingredients => [         {ingredient:'beurre de cacao', percent=>15},         {ingredient:'sucre', percent=>10},         {ingredient:'protéines de lait'},         {ingredient:'oeuf', percent=>1},     ]},     {ingredient=>'émulsifiants', ingredients => [         {ingredient=>'E463'},         {ingredient=>'E432'},         {ingredient=>'E472'},     ]}, ... Pour l'instant j'ai du code à base de regexp avec une fonction récursive, mais c'est très laid et ça marche pas très bien : https://github.com/openfoodfacts/openfoodfacts-server/blob/master/lib/ProductOpener/Ingredients.pm#L251 Je suis sûr qu'il y a des modules qui peuvent faire ce genre de trucs très bien, vous en connaissez ? Merci beaucoup, Stéphane _______________________________________________ Perl mailing list Perl at mongueurs.net http://listes.mongueurs.net/mailman/listinfo/perl From biz at joueb.com Mon Dec 18 14:27:08 2017 From: biz at joueb.com (=?UTF-8?Q?St=c3=a9phane_Gigandet?=) Date: Mon, 18 Dec 2017 14:27:08 +0100 Subject: [Perl] =?utf-8?q?Module_pour_parser_des_parenth=C3=A8ses_imbriqu?= =?utf-8?q?=C3=A9es?= In-Reply-To: References: Message-ID: Merci beaucoup Laurent! Regexp::Grammars a l'air très bien, j'ai commencé à jouer avec, mais il y a un truc que je n'arrive pas à faire, c'est faire en sorte qu'un token matche à minima (de façon "non greedy"). Dans le code ci-dessous, j'aimerais bien que le token [] matche "E-300" mais pas "sel - eau" afin que la règle list_ingredients fasse la séparation avec le tirets entre espaces. Si je mets - en plus dans [^,;\(\)\[\]\{\}\%]* ça va me couper mon E-300. En fait ce que je voudrais faire, c'est mettre un .*? mais ça ne matche plus rien. use Regexp::Grammars; my $parser = qr{     <[composed_ingredient]>* % ([,;]| - ) <[ingredient]> <[percent]>? (\( <[list_ingredients]> \))? (\[ <[list_ingredients]> \])? [^,;\(\)\[\]\{\}\%]* (\d+((\.|\,)(\d+))?)\s?\% }; my  $input = "E-300, sel - eau"; if ($input =~ $parser) {         use Data::Dumper;         print STDERR Dumper(\%/); } Ca donne ça : $VAR1 = {           '' => 'E-300, sel - eau',           'list_ingredients' => {                                   '' => 'E-300, sel - eau',                                   'composed_ingredient' => [                                                              {                                                                '' => 'E-300', 'ingredient' => [ 'E-300' ]                                                              },                                                              {                                                                '' => 'sel - eau', 'ingredient' => [ 'sel - eau' ]                                                              }                                                            ]                                 }         }; Une idée ? Merci, Stéphane > Salut, > > Tu peux définir une grammaire complète avec https://metacpan.org/pod/Regexp::Grammars , mais ça demande un investissement non négligeable pour l'apprentissage. > Sinon s'il ne s'agit que de paires de parenthèses, il y a https://metacpan.org/pod/Regexp::Common::balanced ou https://metacpan.org/pod/Text::Balanced > > Bon travail, Laurent Dami > > -----Message d'origine----- > De : perl-bounces at mongueurs.net [mailto:perl-bounces at mongueurs.net] De la part de Stéphane Gigandet > Envoyé : lundi 18 décembre 2017 10:41 > À : Liste francophone pour les questions générales sur Perl > Objet : [Perl] Module pour parser des parenthèses imbriquées > > Bonjour, > > Pour Open Food Facts j'essaie de parser des listes d'ingrédients qui > ressemblent à ça : > > "farine (12%), chocolat (beurre de cacao (15%), sucre [10%], protéines > de lait, oeuf 1%) - émulsifiants : E463, E432 et E472 - correcteurs > d'acidité : E322/E333 E474-E475, acidifiant (acide citrique, acide > phosphorique) - sel" > > Que j'essaie de transformer en arbre comme : > > [ >     {ingredient=>'farine', percent => 12}, >     [ingredient=>'chocolat', ingredients => [ >         {ingredient:'beurre de cacao', percent=>15}, >         {ingredient:'sucre', percent=>10}, >         {ingredient:'protéines de lait'}, >         {ingredient:'oeuf', percent=>1}, >     ]}, >     {ingredient=>'émulsifiants', ingredients => [ >         {ingredient=>'E463'}, >         {ingredient=>'E432'}, >         {ingredient=>'E472'}, >     ]}, > ... > > Pour l'instant j'ai du code à base de regexp avec une fonction > récursive, mais c'est très laid et ça marche pas très bien : > https://github.com/openfoodfacts/openfoodfacts-server/blob/master/lib/ProductOpener/Ingredients.pm#L251 > > Je suis sûr qu'il y a des modules qui peuvent faire ce genre de trucs > très bien, vous en connaissez ? > > Merci beaucoup, > > Stéphane > > > > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl > From khatar at phear.org Mon Dec 18 14:53:57 2017 From: khatar at phear.org (Marc Chantreux) Date: Mon, 18 Dec 2017 14:53:57 +0100 Subject: [Perl] =?iso-8859-1?q?Module_pour_parser_des_parenth=E8ses_imbriq?= =?iso-8859-1?q?u=E9es?= In-Reply-To: References: Message-ID: <20171218135357.z2wfr23wm4ydxf3l@prometheus.u-strasbg.fr> hello tous les deux, > Tu peux définir une grammaire complète avec > https://metacpan.org/pod/Regexp::Grammars , mais ça demande un > investissement non négligeable pour l'apprentissage. j'ai pas mal écris de Regexp::Grammar y'a qq années et je ne l'utilise que pour des cas complexes. Hors il me semble qu'on a un cas plutot simple ici qui peut se régler avec une boucle while et /\G/cg. le premier exemple qui me vient est celui du code de mon microlisp que j'avais présenté à nancy. https://www.youtube.com/watch?v=hHnq-mVK-cg Stéphane: si tu as des besoins en perf, je serais curieux de comparer les resultats de Regex::Grammars ou pegex vs une simple boucle while. marc From d.minix at gmail.com Mon Dec 18 21:29:01 2017 From: d.minix at gmail.com (Dominique) Date: Mon, 18 Dec 2017 10:29:01 -1000 Subject: [Perl] =?utf-8?q?Module_pour_parser_des_parenth=C3=A8ses_imbriqu?= =?utf-8?q?=C3=A9es?= In-Reply-To: <20171218135357.z2wfr23wm4ydxf3l@prometheus.u-strasbg.fr> References: <20171218135357.z2wfr23wm4ydxf3l@prometheus.u-strasbg.fr> Message-ID: je n'ai jamais utilisé Regexp::Grammars mais auparavant j'utilisais Parse::RecDescent lorsqu'il ma fallait parser des truc complexe. j'aurais tendance a continuer avec celui la (il est du même auteur) cdt Le 18 décembre 2017 à 03:53, Marc Chantreux a écrit : > hello tous les deux, > >> Tu peux définir une grammaire complète avec >> https://metacpan.org/pod/Regexp::Grammars , mais ça demande un >> investissement non négligeable pour l'apprentissage. > > j'ai pas mal écris de Regexp::Grammar y'a qq années et je ne > l'utilise que pour des cas complexes. > > Hors il me semble qu'on a un cas plutot simple ici qui peut se régler > avec une boucle while et /\G/cg. > > le premier exemple qui me vient est celui du code de mon microlisp que > j'avais présenté à nancy. > > https://www.youtube.com/watch?v=hHnq-mVK-cg > > Stéphane: si tu as des besoins en perf, je serais curieux de comparer > les resultats de Regex::Grammars ou pegex vs une simple boucle while. > > marc > _______________________________________________ > Perl mailing list > Perl at mongueurs.net > http://listes.mongueurs.net/mailman/listinfo/perl From sebthebert at gmail.com Thu Dec 28 22:24:00 2017 From: sebthebert at gmail.com (Thebert Sebastien) Date: Thu, 28 Dec 2017 21:24:00 +0000 Subject: [Perl] Felicitations a Laurent ! :) Message-ID: Bonjour, comme je n'ai rien vu passer sur la liste, félicitations à Laurent pour son "White Camel Award" bien mérité ! http://whitecamel.org/p/laurent_boivin.html -------------- section suivante -------------- Une pièce jointe HTML a été nettoyée... URL: