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 :

Supprimer des caractères parasites ?


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut Supprimer des caractères parasites ?
    Bonjour,
    Je cherche à nettoyer de manière simple des caractères parasites communs à deux chaînes de caractères.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $chaine1 = "Bonjourvvv à tous !";
    my $chaine2 = "Bonjourvvv à vous !";
    ici je tente de supprimer uniquement les "v" commun au deux chaînes et ainsi observer ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chaine1 = "Bonjour à tous !";
    $chaine3 = "Bonjour à vous !";
    Je cherchais à faire ça de la manière la plus simple possible. Je voulais avoir vos avis ... merci ...

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Dans tes deux chaines, il y a plein d'autres caractères qui sont communs aux deux chaines (en bleu) ... comment le programme saura reconnaitre que ce sont "vvv" qu'il faut supprimer ?
    my $chaine1 = "Bonjourvvv à tous !";
    my $chaine2 = "Bonjourvvv à vous !";
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Justement je cherche à spécifier le type de caractère commun que je recherche ici les v. En gros je veut supprimer dans les 2 chaînes tout les V qui leurs sont commun.

    L'une des premières idées qui m'est venue est de mettre ces deux chaînes en tableau, je les parcours en parallèle les 2 tableaux et splice les cases contenant les V communs ... mais si je veut tester deux chaînes super-longue se sera vite un cauchemars car trop long !

    Donc je recherche quelques choses de plus simple à faire .....

    J'ai pensé aussi à substr mais faut que je trouve la bonne manière de l'utilisé ...

    Bref je veut bien tous les avis ou idées !

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si je te comprends bien, les caractères parasites sont des v minuscules lorsqu'il sont présent à la même position dans les deux chaines, et il faut modifier les deux chaines en même temps, c'est bien cela ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Si tu as vraiment besoin de performances, tu peux te reporter à la solution que je donnais dans ce sujet, Perl n'est pas très bon pour faire des manips caractère par caractère comme celle que tu demandes.

    --
    Jedaï

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Si je te comprends bien, les caractères parasites sont des v minuscules lorsqu'il sont présent à la même position dans les deux chaines, et il faut modifier les deux chaines en même temps, c'est bien cela ?
    Tout à fait !

    Citation Envoyé par Jedai Voir le message
    Si tu as vraiment besoin de performances, tu peux te reporter à la solution que je donnais dans ce sujet, Perl n'est pas très bon pour faire des manips caractère par caractère comme celle que tu demandes.
    Python serai peut être mieux adapter je pense mais là je dois le faire en perl .... c'est une fonction que je rajouterai dans un module déjà écrit en perl ...

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je pense que ce bout de code doit être relativement efficace (sachant que l'expression régulière est très simple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $chaine1 = "Bonjourvvv à tous !";
    my $chaine2 = "Bonjourvvv à vous !";
     
    my $chaine1_orig = $chaine1; # a conserver pour un usage futur
     
    $chaine1 =~ s/(v+)/substr($chaine2, pos($chaine2), length($1)) eq $1 ? "" : $1/ge;
    $chaine2 =~ s/(v+)/substr($chaine1_orig, pos($chaine1_orig), length($1)) eq $1 ? "" : $1/ge;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Pas mal, je veut bien une petite explication du code ... merci.

    Par contre lorsque je fait un : print "$chaine1\n$chaine2\n"; pour voir ce qu'il advient aux chaînes il me les redonnent comme à l'origine sans changement ?! Vais re-vérifier !

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par kioka Voir le message
    Python serai peut être mieux adapter je pense mais là je dois le faire en perl .... c'est une fonction que je rajouterai dans un module déjà écrit en perl ...
    Je ne voulais pas dire que tu devrais changer de langage en général, simplement que la solution la plus performante, et relativement simple à mettre en place (selon ton environnement) consisterait à embarquer un petit bout de C dans ton Perl, comme dans ma solution (qui d'après solen lui avait permis de passer de 2h pour sa version pur Perl (sans doute pas la meilleure possible) à 2m avec ma fonction).

    --
    Jedaï

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Je ne voulais pas dire que tu devrais changer de langage en général, simplement que la solution la plus performante, et relativement simple à mettre en place (selon ton environnement) consisterait à embarquer un petit bout de C dans ton Perl, comme dans ma solution (qui d'après solen lui avait permis de passer de 2h pour sa version pur Perl (sans doute pas la meilleure possible) à 2m avec ma fonction).
    Oups désolée ! Autant pour moi, j'avais mal compris ! Je regarde ça de plus près dans ce cas merci ...

    Sinon l'idée de philou à l'air bien mais je dois voir pourquoi ça ne marche pas sur mon exemple chez moi ... grrr j'ai due faire une bêtise à tout les coups !

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par kioka Voir le message
    Pas mal, je veut bien une petite explication du code ... merci.

    Par contre lorsque je fait un : print "$chaine1\n$chaine2\n"; pour voir ce qu'il advient aux chaînes il me les redonnent comme à l'origine sans changement ?! Vais re-vérifier !
    Mmm... en recopiant au "propre" mon uniligne (et en adaptant les noms de variable), j'ai merdé lamentablement.
    Voici le code correct, et une explication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $chaine1 = "Bonjourvvv  tous !";
    my $chaine2 = "Bonjourvvv  vous !";
     
    my $chaine1_orig = $chaine1; # a conserver pour un usage futur
     
    $chaine1 =~ s/(v+)/substr($chaine2, pos($chaine1), length($1)) eq $1 ? "" : $1/ge;
    $chaine2 =~ s/(v+)/substr($chaine1_orig, pos($chaine2), length($1)) eq $1 ? "" : $1/ge;
    D'abord, je sauve $chaine1 car il sera modifié avec la première regexp.
    Ensuite, chaque regexp est similaire, j'en explique donc une :
    - le modificateur /ge permet d'exécuter la correspondance de motif autant de fois que nécessaire (/g), et de considérer la partie de substitution comme une expression perl
    - le motif est "v+", c'est à dire le caractère v répété autant de fois que possible (au moins une fois)
    - l'expression de substitution est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substr($chaine1_orig, pos($chaine2), length($1)) eq $1 ? "" : $1
    où $1 est la chaine capturée (vvv dans notre cas). On remplace donc $1 par "" si cette sous-chaine $1 se trouve au même endroit dans l'autre chaine (substr($chaine2, pos($chaine1), length($1) eq $1). Sinon, on garde $1.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Merci ! Je vois l'idée et ça m'intéresse beaucoup
    Mais ça m'a donné des idées ... j'vais tester !

    Je vais l'adapter un peu mieux car si je code avec warnings activé, il hurle !

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par kioka Voir le message
    Je vais l'adapter un peu mieux car si je code avec warnings activé, il hurle !
    Etrange, pas chez moi !
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #14
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Ca ne fait pas de warning chez toi ? oulà quelle erreur de copier coller j'ai encore fait moi !?

    [EDIT]
    Grrr en effet parfois le copier/coller à la souris sur nux peut être bien piège ! On vois pas toujours des ptits truc parasite qui se colle en trop

    C'est nikel et marche bien mais sur de longue chaînes de caractères ! Merci beaucoup à toi ...
    Simple, rapide et qui fait peu de lignes de codes ... merci !
    [/EDIT]

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Si je ne fais pas erreur, cela ressemble grandement à ma solution sauf que :
    - tu réalises les deux remplacements en même temps
    - tu réalises le remplacement "à la main" au lieu de le laisser faire par la regexp s///

    Sinon, je vois pas l'intérêt dans ton cas de sauver $chaine2 dans $save.
    Autre conseil, évite au maximum de trainer $1, qui est une variable automatique qui prend une nouvelle valeur dès qu'un expression régulière capturante est exécutée (dans ton cas, il n'y en a pas, mais une évolution du soft pourrait en faire apparaitre, provoquant alors une régression).
    Je préfère pour cela toujours utiliser la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach my $parasite ($chaine1 =~ /(v+)/g) {
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #16
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    As-tu fais un comparatif de temps d'exécution sur des longues chaines ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  17. #17
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Oui j'ai remarqué que ma solution n'était pas mieux ... d'où je l'ai enlevé ...
    J'ai testé sur des longues chaînes en effet et ça marche bien
    Par contre je ne connaissait pas le coups du foreach ... merci je retiendrais l'astuce !

  18. #18
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    La fille qui aime se compliquer la vie ... et si je veut l'automatiser pour n chaînes ? Idée qui viens de me traverser l'esprit ...

    haem ... j'réfléchis et j'vous dit si je trouve une astuce !

  19. #19
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    bah... c'est un peu plus compliqué, et ce sera aussi bien plus lent.
    J'ai le source dans ma musette... si tu ne trouves rien, je le poste
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  20. #20
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Points : 37
    Points
    37
    Par défaut
    Alors Voilà ce que je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my @tab = ("kikou---a-tous","cicou---a-to-s","ki-ou---a-t--s");
    my $ref = $tab[0]; # a conserver pour un usage futur
    for (my $i = 1; $i < scalar @tab; $i++)
    {
        $tab[0]  =~ s/(-+)/substr($tab[$i], pos($tab[0]), length($1)) eq $1 ? "" : $1/ge;
        $tab[$i] =~ s/(-+)/substr($ref, pos($tab[$i]), length($1)) eq $1 ? "" : $1/ge;
    }
    foreach my $el (@tab)
    {
        print $el,"\n";
    }
    Il semble bien marcher et même pour de longue chaînes de caractères ...

    Si vous avez mieux ... ou d'autres idées ... j'ouvre grandes mes oreilles !

Discussions similaires

  1. Supprimer des caractères d'une chaine
    Par femtoserv dans le forum Access
    Réponses: 6
    Dernier message: 26/02/2007, 10h24
  2. [Tableaux] Supprimer des caractères dans une chaine
    Par ddubois dans le forum Langage
    Réponses: 10
    Dernier message: 16/12/2006, 13h53
  3. Supprimer des caractères.
    Par benitoelputoamo dans le forum Général Python
    Réponses: 2
    Dernier message: 30/10/2006, 20h17
  4. [Système] supprimer des caractères avec preg_replace
    Par Fritzoune dans le forum Langage
    Réponses: 3
    Dernier message: 02/10/2006, 13h59
  5. [VB6] Supprimer des caractères d'une chaine
    Par Overflow64 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/10/2005, 10h26

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