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 :

probleme de regex! (debutant)


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut probleme de regex! (debutant)
    bonjour à tous!

    voila j'ai un petit probleme avec mes substitutions (je crois que vous appelez ça regex...?) , j'ai cherché une réponse à mon problème dans la faq et dans le forum mais je n'ai pas trouvé...

    alors voici mon souci:
    Dans un petit programme, je parcours un fichier HTML ligne par ligne, je modifie chaque ligne, et je les mets dans un autre fichier...

    pour les modifier, j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ligne=~s/<.*?>//g;
     
    $ligne=~s/[.,!,,,?,]//g;
    Seulement, quand le fichier html contient une ligne vide, la programme s'arrête, idem quand il ne contient pas de balise <...> à une ligne...

    Je pense que PERL ne trouvant pas dans la ligne les caractères à remplacer, fait la tête...

    Comment corriger cela, il y a il une option comme "g" (substituer pour toutes les occurences) ?

    merci d'avance, et à bientôt

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 587
    Points : 2 036
    Points
    2 036
    Par défaut
    Bonjour,

    pour répondre sur 2 choses :

    - oui, tu peux ajouter un "g" (pour global) afin que la modif que tu souhaites soit réalisée autant de fois que trouvée sur une ligne.

    - si ton script Perl s'arrête, c'est qu'à mon avis il plante parce que je n'ai jamais vu jusqu'ici un script Perl s'arrêter à cause d'une substitution de chaîne non faite ou non trouvée.

    A la première ligne de ton script (là où tu dois avoir quelque chose ressemblant à #!c:\perl\bin\perl ou #!/usr/bin/perl, ajoute l'option -w (exemple : #!/usr/bin/perl -w). Cette option a pour effet d'activer des messages d'avertissement de l'interprêteur/compilateur de Perl, ce qui le rend nettement plus verbeux.

    Autre chose à tester également : dans une console Ms-Dos ou Unix (je ne connais pas ton système), taper ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -c -w monscript.pl
    Ca n'exécutera pas ton programme mais l'interprêteur le testera pour voir si c'est ok, syntaxiquement parlant.

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Bonjour,

    Citation Envoyé par kriskikout
    voila j'ai un petit probleme avec mes substitutions (je crois que vous appelez ça regex...?)
    Presque ... la RegEx, ou Expression Rationnelle est en fait une sorte d'automate à états qui permet de faire de la substitution de motifs, mais aussi de la recherche, de la translittération, ...

    Citation Envoyé par kriskikout
    alors voici mon souci:
    Dans un petit programme, je parcours un fichier HTML ligne par ligne, je modifie chaque ligne, et je les mets dans un autre fichier...
    Ce type de méthode a ses limites : rien n'oblige le HTML a avoir le début et la fin de d'une balise sur la même ligne, notamment quand il y a des paramètres ...

    Il vaut mieux considérer le HTML comme un flux continu, plutôt que comme un ensemble de lignes.

    C'est pour cela qu'il existe des modules spécifiques à la manipulation du HTML.

    Maintenant, si tu es sûr de ton fichier, en pis-aller, tu peux essayer de traiter ligne à ligne.

    Citation Envoyé par kriskikout
    pour les modifier, j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ligne=~s/<.*?>//g;
     
    $ligne=~s/[.,!,,,?,]//g;
    Seulement, quand le fichier html contient une ligne vide, la programme s'arrête, idem quand il ne contient pas de balise <...> à une ligne...

    Je pense que PERL ne trouvant pas dans la ligne les caractères à remplacer, fait la tête...
    Je ne crois pas que ce soit l'échec de la substitution qui provoque directement l'arrêt de ton script. Il doit y avoir un défaut dans ta structure, ton algorithme, qui provoque cet arrêt.

    Il faudrait que tu nous en poste un peu plus pour en avoir la certitude.

    Par ailleurs, ta substitution avec les [] consiste à remplacer les caractères contenus entre les crochets par "rien". Est-ce vraiment ce que tu veux, ou bien le motif que l'on voit est il plutôt un "gribouillis" à supprimer, avec les crochets et tout ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    merci pour vos réponses!

    alors, plus de précision s'impose:
    tout d'abord, ce message est un peu la suite de celui la qui devenait un peu "bordelique" pour le continuer...

    Voici mon code:
    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
     
    #!usr/bin/perl -w
    print "le programme liste tout les mots du fichier texte dans le fichier resultat!";
    open (PAGEWEB,"page.htm");
    open (RESULTAT, ">resultat.txt");
    while ($ligne=<PAGEWEB>) {
    	my @tab;
    	$ligne=~s/<.*?>//g;
    	$ligne=~s/[.,!,,,?,]//g;
    	@tab= split (' ',"$ligne");
    	$tab[$#tab]="$tab[$#tab]"."\n";
    	print RESULTAT join("\n", @tab);
     
    }
    close PAGEWEB;
    close RESULTAT;
    <STDIN>;
    Voici ma page web:
    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
     
    <html>
     
    <head>
    <meta http-equiv="Content-Language" content="fr">
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <title>bienvenue sur ma page web</title>
    </head>
     
    <body>
     
    <p>bienvenue sur ma page web!</p>
    <p>elle est terrible ma page!</p>
    <p>ah bon? tu trouve?</p>
    <p>oui.</p>
     
    </body>
     
    </html>
    voici l'erreur lors du lancement de mon script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Use of uninitialized value in string at listagemot.pl line 10, <PAGEWEB> line 1.
     
    Modification of non-creatable array value attempted, subscript -1 at listagemot.
    pl line 10, <PAGEWEB> line 1.
    Par ailleurs, ta substitution avec les [] consiste à remplacer les caractères contenus entre les crochets par "rien". Est-ce vraiment ce que tu veux, ou bien le motif que l'on voit est il plutôt un "gribouillis" à supprimer, avec les crochets et tout ?
    heu... en fait, mon but est de supprimer les caractères suivants: point, virgule, point d'exclamation, point d'interrogation.
    Il y a surement une expression plus claire pour écrire ça du genre "tout les caractère non alphe-numerique"... mais je ne la connais pas pour l'instant!

    voili voilou...

  5. #5
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par kriskikout
    Voici mon code:
    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
     
    #!usr/bin/perl -w
    print "le programme liste tout les mots du fichier texte dans le fichier resultat!";
    open (PAGEWEB,"page.htm");
    open (RESULTAT, ">resultat.txt");
    while ($ligne=<PAGEWEB>) {
    	my @tab;
    	$ligne=~s/<.*?>//g;
    	$ligne=~s/[.,!,,,?,]//g;
    	@tab= split (' ',"$ligne");
    	$tab[$#tab]="$tab[$#tab]"."\n";
    	print RESULTAT join("\n", @tab);
     
    }
    close PAGEWEB;
    close RESULTAT;
    <STDIN>;
    voici l'erreur lors du lancement de mon script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Use of uninitialized value in string at listagemot.pl line 10, <PAGEWEB> line 1.
     
    Modification of non-creatable array value attempted, subscript -1 at listagemot.
    pl line 10, <PAGEWEB> line 1.
    Il faut dire qu'avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab[$#tab]="$tab[$#tab]"."\n";
    je ne comprends pas exactement ce que tu veux faire ... et visiblement, Perl non plus


    Citation Envoyé par kriskikout
    heu... en fait, mon but est de supprimer les caractères suivants: point, virgule, point d'exclamation, point d'interrogation.
    Il y a surement une expression plus claire pour écrire ça du genre "tout les caractère non alphe-numerique"... mais je ne la connais pas pour l'instant!
    Tous les caractères de ponctuation, par exemple, on peut l'écrire [:punct:]
    Sinon, pour le "split", je suggère l'utilisation d'une expression rationnelle /\s+/ (séparateurs, 1 à n consécutifs), plutôt que " ".

    Et pour ton print final, il y plusieurs manières de l'envisager :

    Avec quelques autres petites retouches (suppression des mises entre quotes de variables), ton script devient :
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    print "le programme liste tout les mots du fichier texte dans le fichier resultat!\n";
    open (PAGEWEB,"page.htm");
    open (RESULTAT, ">resultat.txt");
    while (my $ligne=<PAGEWEB>) {
    	my @tab;
    	$ligne=~s/<.*?>//g;
    	$ligne=~s/[[:punct:]]//g;
    	@tab= split (/\s+/,$ligne);
    	print RESULTAT "$_\n" foreach (@tab);
    }
    close PAGEWEB;
    close RESULTAT;
    <STDIN>;

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par 2Eurocents
    Il faut dire qu'avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab[$#tab]="$tab[$#tab]"."\n";
    je ne comprends pas exactement ce que tu veux faire ... et visiblement, Perl non plus
    J'avais mis ça pour qu'il saute une ligne a la fin du tableau... Mais, je ne sais pas pourquoi j'ai fait comme ça...? ca fait vraiment bricolage à l'arrache! je préfère tes solutions


    Tous les caractères de ponctuation, par exemple, on peut l'écrire [:punct:]
    Sinon, pour le "split", je suggère l'utilisation d'une expression rationnelle /\s+/ (séparateurs, 1 à n consécutifs), plutôt que " ".
    Oki, c'est noté! Par contre pour le "\s+" j'ai pas compris le coup du 1 à n consecutif...

    Et pour ton print final, il y plusieurs manières de l'envisager :
    effectivement, le coup du foreach n'est pas mal.

    une dernière petite question: l'erreur de mon programme était due à quel ligne? à quoi précisement? (j'essaye de débugguer, si je trouve je vous dit)

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par kriskikout
    Oki, c'est noté! Par contre pour le "\s+" j'ai pas compris le coup du 1 à n consecutif...
    "\s" signifie "un caractère d'espacement (blanc, tabulation, ...).
    Le "+", derrière, est un quantificateur de répétition. Il signifie 1 occurence de ce qui précède ou plus. Donc, dans le split, on divise ainsi en prenant comme séparateurs les paquets de 1 à n espaces consécutifs.


    Citation Envoyé par kriskikout
    une dernière petite question: l'erreur de mon programme était due à quel ligne? à quoi précisement? (j'essaye de débugguer, si je trouve je vous dit)
    Je crois me souvenir que c'était justement la ligne que ni Perl, ni moi ne comprenions. Reprend ton script et commente la, tu verras.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 24
    Points
    24
    Par défaut
    effectivement, c'est bien cette ligne qui posait problème!

    merci pour tout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec REGEX sous IE
    Par Death83 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 18/07/2006, 21h02
  2. probleme d'un debutant
    Par jalilc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/06/2006, 20h54
  3. Probleme simple de debutant avec INSERT TO et UPDATE
    Par Tom_Cruise dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/08/2005, 09h15
  4. [langage] autre probleme de regex
    Par Ludo167 dans le forum Langage
    Réponses: 3
    Dernier message: 18/08/2004, 18h01
  5. [langage] probleme de regex
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2004, 16h36

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