Forum Programmation.autre un petit challenge avec mes amies les regex ! (boucles de remplacement)

Posté par  .
Étiquettes : aucune
1
3
juil.
2011

bonjour,

je suis toujours aussi gauche avec les regex, et cette fois-ci je voulais savoir s'il était possible de faire des remplacements conditionnels, selon des délimiteurs données, ainsi je voudrais que ça :

== 1 ==

blablabla exemple de texte pour ce paragraphe.

- Exemple d'entrée : 48
- Autre exemple de choix : 51


== 2 ==

blablabla autre exemple de texte pour cet autre paragraphe.

- exemple de choix : 23
- et encore un autre exemple : 5

Devienne :

The Page1 is a page. "blablabla exemple de texte pour ce paragraphe."

A choice called Page1ChoiceA is for Page1. "Exemple d'entrée." It triggers Page48.
A choice called Page1ChoiceB is for Page1. "Autre exemple de choix." It triggers Page51.

The Page2 is a page. "blablabla autre exemple de texte pour cet autre paragraphe."

A choice called Page2ChoiceA is for Page2. "exemple de choix." It triggers Page23.
A choice called Page2ChoiceB is for Page2. "et encore un autre exemple." It triggers Page5.

La difficulté pour moi c'est d'arriver à ne faire les incrémentations (###choiceA, B etc) que dans un espace donné et délimité.

(ça pourrait être en perl, python, bash ou autre, le langage m'importe peu)

  • # en Perl

    Posté par  (site web personnel) . Évalué à 1.

    Je suis pas sûr d'avoir compris ce qui te pose problème mais en Perl tu peux faire appel à une fonction lors du remplacement avec /e. Par exemple pour remplacer des caractères par leur code ASCII : s/(.)/ord($1)/gei

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Gestion de rupture ?

    Posté par  . Évalué à 2.

    J'ai du rater un truc, mais ne s'agit-il pas d'une gestion de rupture la plus simple existant ?
    Quand tu trouves une en-tête de page, tu réinitialises ton "compteur" de choix.

    Un exemple un peu crade en perl :

    #! /usr/bin/perl -w
    
    use strict;
    
    my $NumPage=0;
    my $NumChoice='A';
    my $Text='';
    
    while (<>)
    {
      chomp;
      if (/^== ([0-9]+) ==$/) # Page line
      {
        $NumPage=$1;
        $NumChoice='A'; # Reinitialize choice for new page
        $Text='';
      }
      elsif (/^$/) # Empty line
      {
        if ($Text ne '')
        {
          print "The Page${NumPage} is a page. \"${Text}\"\n";
        }
        print "\n";
      }
      elsif (/^- (.*) : ([0-9]+)$/) # Choice line
      {
        my ($ChoiceText,$TargetPage)=($1,$2);
        print "A choice called Page${NumPage}Choice${NumChoice} is for Page${NumPage}. \"${ChoiceText}\" It triggers Page${TargetPage}\n";
        $NumChoice++;
      }
      else # Text line
      {
        $Text .= $_;
      }
    }
    
    • [^] # Re: Gestion de rupture ?

      Posté par  . Évalué à 2.

      merci je vais regarder ça !

      Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

    • [^] # Re: Gestion de rupture ?

      Posté par  . Évalué à 2.

      ne s'agit-il pas d'une gestion de rupture la plus simple existant ?

      c'est possible, mais je ne sais pas du tout comment gérer ça. Ton exemple m'a bien dépanné, merci encore. J'ai fait quelques ajustements par rapport au cas réel (notamment parce que ça répète toutes les phrases lorsqu'il un a un retour à la ligne suivi d'une ligne vide), et maintenant ça sort un code final plutôt correct.

      Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.