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 :

expression régulière avec perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 29
    Points : 23
    Points
    23
    Par défaut expression régulière avec perl
    Bonjour à tous ,

    j'ai le code suivant qui permet de convertir un text en un fichier xml ,
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/env perl
        use strict;
        use warnings;
        use autodie;
     
     
    open(my $fh, "<:utf8", 'input') or die "Failed to open file: $!\n";
     
    open my $fh1, ">:utf8", 'output.xml';
     
     
        my ($entry, $gloss, $exemple);
        while (<$fh> ) {
            chop;
         if (/^\(([^)]+)\)([^{]*)(\{(.*)\})?$/)  {
     
            print_stuff($entry, $gloss, $exemple);
            ($entry, $gloss, $exemple) = ($1, $2, $4);
            next;
            }
     
            if (/^([^{]+)(\{(.*)\})?$/)  {
            $gloss .= $1;
            $exemple .= $3?$3:"";
            next;
            }
     
            if (/^\{(.+)\}$/)  {
            $exemple .= $1;
            next;
            }
        }
        print_stuff($entry, $gloss, $exemple);
        close $fh1;
        close $fh;
     
        sub print_stuff {
            my ($entry, $gloss, $exemple) = (shift, shift, shift);
            return unless($entry);
            print $fh1 "<entry form=\"$entry\">\n";
            print $fh1 "\t<defs>\n";
            print $fh1 "\t\t<gloss>$gloss</gloss>\n";
            print $fh1 "\t\t<exemple>$exemple</exemple>\n" if ($exemple);
            print $fh1 "\t</defs>\n";
            print $fh1 "</entry>\n\n\n";
        }
    par exemple pour la ligne suivante:
    (الْبَين) الْوَاضِح والطلق اللِّسَان الفصيح (ج) أبيناء وبيناء وأبيان
    la sortie est :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <entry form="الْبَين">
    	<defs>
    		<gloss> الْوَاضِح والطلق اللِّسَان الفصيح (ج) أبيناء وبيناء وأبيان</gloss>
    	</defs>
    </entry>

    je veux modifier l'expression régulière pour afficher seulement : s'arreter lorsqu'il y a une " ("
    Citation Envoyé par xml
    <entry form="الْبَين">
    <defs>
    <gloss> الْوَاضِح والطلق اللِّسَان الفصيح </gloss>
    </defs>
    </entry>
    quelqu'un peut m'aider ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,,
    DSL, mais je n'arrive pas à faire le lien entre ton texte en arabe (je suppose que c'est de l'arabe) et le fichier XML résultat en points de code. Du coup, je ne comprends pas vraiment ta question.

    Deux points me viennent cependant à l'esprit:
    - si tu veux t'arrêter à une première parenthèse, tu devrais consulter la documentation sur les quantificateurs gourmands et non gourmands (ou frugaux), c'est peut-être ce dont tu as besoin.
    - Les regex examinent normalement le texte source de gauche à droite, je ne sais pas ce qui se passe avec une langue écrite de droite à gauche.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    comme vous avez dit je veux m'arreter à la première parenthèse sur la meme ligne

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    D'abord je ne maîtrise pas l'arabe

    Ensuite je ne te fais pas un dessin sur la gestion des caractères arabes dans les éditeurs de textes...

    Ainsi si je copie ta phrase :
    (الْبَين) الْوَاضِح والطلق اللِّسَان الفصيح (ج) أبيناء وبيناء وأبيان
    Tu noteras que même sur le forum on n'arrive pas à mettre les parenthèses au bon endroit
    Dans un éditeur de texte, j'obtiens l'image jointe, les parenthèses ne sont pas au bon endroit...
    Sans la possibilité de constituer le fichier input correctement, il me sera difficile de t'aider...

    Ceci dit une suggestion, plutôt que d'utiliser les regex, découper la ligne selon les parenthèses :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use autodie;
     
     
    open(my $fh, "<:utf8", 'input') or die "Failed to open file: $!\n";
     
    open my $fh1, ">:utf8", 'output.xml';
     
     
    my ($entry, $gloss, $exemple);
    while ( my $Line = <$fh> ) {
    	chop $Line;
    	my @Tableau = split (/\)/, $Line);
    	print_stuff($Tableau[0], $Tableau[1], $Tableau[2]);
    }
     
     
    close $fh1;
    close $fh;
     
    sub print_stuff {
    	my ($entry, $gloss, $exemple) = (shift, shift, shift);
    	return unless($entry);
    	print $fh1 "<entry form=\"$entry\">\n";
    	print $fh1 "\t<defs>\n";
    	print $fh1 "\t\t<gloss>$gloss</gloss>\n";
    	print $fh1 "\t\t<exemple>$exemple</exemple>\n" if ($exemple);
    	print $fh1 "\t</defs>\n";
    	print $fh1 "</entry>\n\n\n";
    }
    j'obtiens :
    <entry form="(الْبَين">
    <defs>
    <gloss> الْوَاضِح والطلق اللِّسَان الفصيح (ج</gloss>
    <exemple> أبيناء وبيناء وأبيان</exemple>
    </defs>
    </entry>
    Ensuite pour chaque cellule il faut traiter les parenthèses fermantes...
    [Edit 02:35] Parenthèses fermantes
    Ça pourrait donner çà :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use autodie;
     
     
    open(my $fh, "<:utf8", 'input') or die "Failed to open file: $!\n";
     
    open my $fh1, ">:utf8", 'output.xml';
     
     
    my ($entry, $gloss, $exemple);
    while ( my $Line = <$fh> ) {
    	chop $Line;
    	my @Tableau = split (/\)/, $Line);
     
    	$Tableau[0] =~ s/\(//;
    	$Tableau[1] =~ s/^\s//;
    	$Tableau[1] =~ s/\s\(.//;
    	$Tableau[2] =~ s/^\s//;
     
    	print_stuff($Tableau[0], $Tableau[1], $Tableau[2]);
    }
     
     
    close $fh1;
    close $fh;
     
    sub print_stuff {
    	my ($entry, $gloss, $exemple) = (shift, shift, shift);
    	return unless($entry);
    	print $fh1 "<entry form=\"$entry\">\n";
    	print $fh1 "\t<defs>\n";
    	print $fh1 "\t\t<gloss>$gloss</gloss>\n";
    	print $fh1 "\t\t<exemple>$exemple</exemple>\n" if ($exemple);
    	print $fh1 "\t</defs>\n";
    	print $fh1 "</entry>\n\n\n";
    }
    c'est du coup par coup, voir si les autres phrases sont constituées de la même façon... adapter les substitutions... :
    <entry form="الْبَين">
    <defs>
    <gloss>الْوَاضِح والطلق اللِّسَان الفصيح</gloss>
    <exemple>أبيناء وبيناء وأبيان</exemple>
    </defs>
    </entry>
    NB : les substituions correspondent à mon fichier en entrée dans lequel les parenthèses fermantes ne sont pas au bon endroit...


    Bien sûr ce n'est pas terrible, mais c'est peut-être une piste...

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut Ftina,

    si je reprends ton exemple et par rapport à ta regex (ligne 15) :
    (الْبَين) الْوَاضِح والطلق اللِّسَان الفصيح (ج) أبيناء وبيناء وأبيان
    si j'ai bien compris on identifie assez facilement entry et gloss, en revanche je ne comprends pas comment tu match 'exemple'

    le problème étant que le . est mal adapté ici dans les regex, du fait des caractères qui sont encodés sur plusieurs octets, c'est très bien expliqué ici pour peu qu'on lise l'anglais

    pour le moins avec la regex suivante on parvient à s'en sortir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($entry, $gloss) = $_ =~ /^\p{Ps}(\X+?)\p{Pe}\X+\p{Pe}([^\p{Pe}]+)$/
    • \p{Ps} est une parenthèse ouvrante (parenthesis start ?), quelque soit la façon dont elle est encodée, et son pendant \p{Pe} pour la parenthèse fermante (parenthesis end ?)
    • \X représente n'importe quel caractère unicode, en gros c'est l'équivalent du point .

    les autres tokens (incluant des trucs comme \p{Arabic} par exemple) sont dispos dans le lien que j'ai donné plus haut
    la regex en action : https://regex101.com/r/tJ2wYA/3

Discussions similaires

  1. [RegEx] Expression régulière avec preg_match_all
    Par tit_oune dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 23h28
  2. Expressions régulières avec variable
    Par killprog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/04/2006, 17h03
  3. Expression réguliére avec CHECK
    Par BRAUKRIS dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2005, 17h38
  4. Expression régulière avec "|"
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2005, 15h09
  5. [langage] Ptit Probleme expression réguliere avec perl
    Par Shoot Again dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2004, 12h44

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