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 :

chercher une chaine de caracteres et remplacement


Sujet :

Langage Perl

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut chercher une chaine de caracteres et remplacement
    Bonjour à tous,
    Je cherche une idée comment faire la recherche d'une chaine de caractere dans un texte et le remplacer par une autre:
    exemple:
    chaine à recherche : good morning
    à doit la remplacer dans le texte par "good+morning"
    Une idée?
    Merci d'avance

  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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    tu ne donnes pas beaucoup de détails. Tu peux essayer cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne =~ s/good morning/good+morning/

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    tu ne donnes pas beaucoup de détails. Tu peux essayer cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne =~ s/good morning/good+morning/
    Merci Lolo,
    Oui vous avez raison,
    En fait j'ai une liste de chaine de caractere composéées de 2 mots
    , le traitement c'est qui va lire cette liste de chaine de caractere et pour chaque chaine de caractere, on va la chercher dans un fichier de texte, quand il la trouve, il va coller les deux mot par un signe "+"
    exemple:
    si jai la chaine axx bzz
    il fera la jointure "axx+bzz"
    voilà
    Merci

  4. #4
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je pense que le mieux est de commencer par lire le fichier texte de paramétrage et de stocker les paires de mots dans une table de hachage.

    Ensuite, tu lis ton texte, découpes chaque ligne en une liste de mots (avec la fonction split) et recherches chaque paire de mots dans le hachage. Si tu trouves une paire de mots, tu remplaces l'espace séparant les mots par le signe +.

  5. #5
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Lolo,
    j'ai dejà stocké les mot dans la table de hachage..
    là juste j'aimerai sa voir comment parser la ligne de cette facon:
    exp :
    bonjour les amis
    -->
    bonjour les
    les amis

    c'st un peu compliqué

  6. #6
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Oui, il y a plusieurs complications. D'une part, le cas des groupes de mots sur plusieurs lignes. D'autre part, les divers signes de ponctuation qui peuvent aussi séparer les mots, pas seulement les espaces entre les mots. Il faudrait un exemple réel des fichiers en entrée pour répondre complètement. Enfin, tu parlais de groupes de 2 mots, si les groupes peuvent avoir 3 ou plus de mots, ça complique aussi l'affaire.

    Une solution envisageable est de redéfinir $/, la variable spéciale de séparation des enregistrements en entrée (par défaut le caractère newline).

    L'idée pourrait être de faire des traitements en sorte d'obtenir pour chaque paragraphe une simple liste de mots dans un tableau, puis d'étudier le tableau de façon systématique.

    Suivant les cas, il se peut qu'une simple utilisation des expressions régulières et des fonctions Perl ne soit pas suffisante ou devienne trop complexe et que tu aies besoin d'un vrai parser. Par exemple le module Parse::RecDescent, de Damian Conway, mais cela t'oblige à écrire une grammaire, c'est tout de suite plus complexe (perso, j'essaierais d'éviter dans la mesure du possible, mais c'est peut-être la meilleure solution si le fichier en entrée peut être bien complexe).

  7. #7
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Lolo, j'essaye de comprendre là :
    voilà un exemple du bout de texte :
    reprise de la session
    je déclare reprise la session du parlement européen qui avait été interrompue le vendredi
    ...
    le texte ne contient pas de la ponctuation.

  8. #8
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    S'il n'y a pas de ponctuation, ça simplifie l'affaire.

    Je viens d'essayer sous le debugger avec la phrase:

    "je déclare reprise la session du parlement européen qui avait été interrompue
    le vendredi"

    (avec un retour à la ligne après le mot "interrompue").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $c = "je déclare reprise la session du parlement européen qui avait été interrompue \n le vendredi";
    @t = split / \s+/, $c;
    Le tableau @t contient maintenant:

    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
      DB<23> x @t
    0  'je'
    1  'déclare'
    2  'reprise'
    3  'la'
    4  'session'
    5  'du'
    6  'parlement'
    7  'européen'
    8  'qui'
    9  'avait'
    10  'été'
    11  'interrompue'
    12  'le'
    13  'vendredi'
    Donc, en utilisant /\s+/ comme motif de splittage, le tableau semble alimenté correctement avec les mots de la phrase. Il suffit en principe de comparer chaque paire de mots avec ta table de hachage, puis de reconstituer la chaîne de caractère en remplaçant les espaces par des + là où il faut.

  9. #9
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Bonjour,
    je cherche une piste pour remplacer le caractere "espace" d"une chaine de caractere qui contient un seul espace par un +
    good morning -----------> good+morning
    Merci

  10. #10
    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
    Deux méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $chaine = "good morning";
    $chaine =~ tr/ /+/;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $chaine = "good morning";
    $chaine =~ s/ /+/g;

  11. #11
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Philou67430

  12. #12
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    Bonjour,
    je cherche une piste pour remplacer le caractere "espace" d"une chaine de caractere qui contient un seul espace par un +
    good morning -----------> good+morning
    Merci
    Je t'ai déjà donné la réponse le 30/09.

    Sinon, Philou t'a donné une solution plus générale, mais je ne suis pas sûr que ce que tu demandes soit la question la plus urgente pour toi, compte tenu de ta description du problème que tu veux résoudre. Il faut d'abord que tu identifies là où tu dois faire les changements, et compte tenu de ce que tu vas sans doute devoir faire pour cela, la question du remplacement se posera sans doute autrement et sera probablement plutôt: comment ajouter un + entre les mots "good" et "morning".

  13. #13
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je t'ai déjà donné la réponse le 30/09.

    Sinon, Philou t'a donné une solution plus générale, mais je ne suis pas sûr que ce que tu demandes soit la question la plus urgente pour toi, compte tenu de ta description du problème que tu veux résoudre. Il faut d'abord que tu identifies là où tu dois faire les changements, et compte tenu de ce que tu vas sans doute devoir faire pour cela, la question du remplacement se posera sans doute autrement et sera probablement plutôt: comment ajouter un + entre les mots "good" et "morning".
    Merci Lolo,
    En fait oui, le probleme est il ya la notion d'ordre
    j'explique
    soit le fichier qui contient les liste des cahien de caractere trié de cette facon :
    bonjour les
    les amis
    amis du
    du monde
    le but c'est de remplacer au debut dans tout le fichier texte "bonjour les" par "bonjour+les"
    apres avoir finit ca, il passe à la chaine "les amis" il la remplace dans le fichier par "les+amis"
    ainsi de suite...
    c'est pour ca j'ai changé (je cherche encore) la meilleur solution

  14. #14
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Une petite piste
    Merci d'avance pour vos aides!
    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;
    use feature qw(:5.10);
    my $InFile = "/home/cyrine/restri";
     my $InFile = "/home/cyrine/restri2";
    open my $fh_infile, '<', $InFile or die "Can't open $InFile\n";
    open my $fh_infile2, '<', $InFile2 or die "Can't open $InFile2\n";
    while ( my $Ligne = <$fh_infile> ) {
    if ($Ligne =~ /^(.*?)\->/)
    {
      while ( my $Ligne2 = <$fh_infile2> ) {
      if ( $reponse =~/$1/) {
    }
    }
    }
    }
    close $fh_infile;

  15. #15
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Je reste sur l'idée de transformer ta phrase en tableau de mots, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    0  'je'
    1  'déclare'
    2  'reprise'
    3  'la'
    4  'session'
    5  'du'
    6  'parlement'
    7  'européen'
    8  'qui'
    9  'avait'
    10  'été'
    11  'interrompue'
    12  'le'
    13  'vendredi'
    Je regarde ensuite le premier élément du tableau, c'est "je". Je regarde alors le second, c'est "déclare". Est-ce que "je déclare" est une phrase clef dans mon hash de paramétrage. Oui? Alors je commence à reconstruire ma phrase comme "je+déclare", sinon, je la reconstruis comme "je déclare". Le troisième élément du tableau est "reprise". Est-ce que "déclare reprise" est une phrase clef? Si oui, j'ajoute "+reprise" à ma phrase reconstruite, sinon, j'ajoute " reprise" à ma phrase reconstruite.

    Ma phrase reconstruite a maintenant quatre possibilités suivant les réponses aux diverses questions:
    - je+declare+reprise ...
    - Je+déclare reprise ...
    - je déclare+reprise ...
    - je déclare reprise ...

    Et ainsi de suite, je continue à reconstruire ma phrase progressivement en examinant successivement chaque paire de mots, que le premier mot de la paire courante ait eu ou non une reconnaissance comme deuxième mot de la paire précédente.

  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
    C'est vrai qu'en donnant ma réponse, j'avais relu le dernier message, et le premier, mais pas les développements intermédiaires.
    La piste fournie par Lolo est alors la bonne à mon sens.

  17. #17
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Bonjour,
    Au depart je vous remecie pour vos reponse
    En fait , je vais coller par "+" deux mot par 2
    ca veut dire j'aurais pas : je+declare+reprise session
    jaurais soit :
    je declare+reprise session....
    ou
    je+declareb reprise+session......
    ...
    donc je veais joindre au debout les 2 mots qui apparaissent avant dans lautre fichier
    par exemple si jai dabns lautre fichier :
    je déclare
    reprise session
    je dois avoir comme resultat :
    je+declare reprise+session......
    comme je+declare reprise+session

    voilà

    c'est pour ca jai pensé à remplacer chaine par chaine dans tout le fichier

  18. #18
    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
    Il serait peut-être utile de fournir deux exemples de fichiers d'entrées et un exemple du résultat attendu (si possible qui inclue toutes les possibilités).

  19. #19
    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 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    +1 avec Philou, donne un exemple bien plus complet du fichier en entrée, du fichier de paramétrage et du fichier résultat voulu.

    Je reste pour l'instant convaincu que si le fichier de paramétrage contient plus de quelques paires de mots, le processus sera très inefficace et complexe avec une simple utilisation d'expressions régulières pour faire des substitutions dans le texte existant.

    D'un autre côté, utiliser un parser générique comme Parse::RecDescent ou Yaml serait un peu comme employer un marteau-pilon pour écraser une mouche (encore que... si tes besoins sont appelés à se complexifier...).

    A mon avis, avec tes besoins actuels, il faut transformer ta phrase en entrée en une liste de tokens (ce que j'ai fait avec mon tableau de mots) et utiliser un hash pour identifier les paires éligibles à l'utilisation d'un "+" à la place d'un espace, de façon à réécrire la phrase progressivement avec des "+" là où il faut.

    Je suis actuellement en voyage et n'ai pas accès à un environnement Perl dans l'immédiat, donc je ne vais pas te proposer pour l'instant un programme tout fait que je ne serai pas en mesure de tester, mais, pour moi, l'algorithme principal du programme (c'est-à-dire hors ouverture et fermeture des fichiers, alimentation du hash de paramétrage, etc.) tient facilement en nettement moins de 10 lignes de code. Il y a bien sûr quelques détails supplémentaires à clarifier (gestion des retours à la ligne, reconnaissances imbriquées ou non, etc.), mais ce sont des points de détail.

  20. #20
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Il serait peut-être utile de fournir deux exemples de fichiers d'entrées et un exemple du résultat attendu (si possible qui inclue toutes les possibilités).
    Merci
    Voilà le fichier qui contient les séquence
    la commission
    le président
    l union
    monsieur le
    union européenne
    le fichier texte :
    le président appelle la commission de l union européenne
    l union et la commission
    bon 1er chose à faire
    c'est joindre la séquence " la commission" dans tous le texte
    on aura alors :
    le président appelle la+commission de l union européenne
    l union et la+commission
    apres on a la séqunecs le président :
    donc on fait la jointure des deux mot le+président
    on aura ce fichier alors :
    le+président appelle la+commission de l union européenne
    l union et la+commission
    ainsi de suite...
    au final on aura ce fichier la de resultat
    le+président appelle la+commission de l+union européenne
    l+union et la+commission
    voilà
    Merci

Discussions similaires

  1. chercher une chaine de caracteres et affichage
    Par étoile de mer dans le forum Langage
    Réponses: 9
    Dernier message: 26/09/2012, 12h36
  2. Chercher une chaine de caractere avec inconnus
    Par linked dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 24/05/2010, 03h06
  3. Chercher une chaine de caracteres dans toute ma base
    Par miltonis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/09/2007, 18h33
  4. comment chercher une chaine de caractere
    Par phpaide dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 13h12
  5. Réponses: 9
    Dernier message: 31/05/2005, 15h34

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