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 :

Comment extraire du texte avec une regex


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur logiciel
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur logiciel

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Comment extraire du texte avec une regex
    bonjour
    je cherche a faire un regex pour extraire des sous textes dans un texte

    chapitre 1
    a
    b
    c
    d participant "nestor"
    e
    f
    chapitre 2
    g
    h
    i
    j
    k participant "robert"
    l
    ....

    ce que je voudrais

    c'est capturer chaque chapitre

    chapitre 1
    a
    b
    c
    d participant "nestor"
    e
    f

    et en extraire le numéro du chapitre ainsi que le nom du participant.

    j'avais pense a un caractere d'arret, mais je n'ai pas la maitrise sur le texte fourni. Or pour arreter le bloc en question, le caractere c de chapitre ne suffirait pas. il faudrait stipuler "chapitre" en delimiteur d'arret de bloc.

    Sauriez vous faire ca en regex?

    Grand merci de votre aide.

    Cdt

  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
    Pas sûr de bien comprendre le détail de ce que tu veux, il faudrait un exemple un peu plus réaliste,, mais tu peux sans doute utiliser une assertion avant de longueur nulle pour arrêter la reconnaissance au début du chapitre suivant. Quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /Chapitre\s+?(\d+).+?participant \s+"(\w+).+?(?=Chapitre)/g
    (Écrit sur ma tablette et pas testé.)

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur logiciel
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur logiciel

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    bonjour
    Merci beaucoup
    cela marcherait si le recherché etait sur une seule ligne.
    si j'avais chapitre 1 kjdkjkdjkdjkj participant "nestor" ddedn,nd,nd,n,dns,ns,n,sn;,;,;d,; chapitre 2 .....

    ton expression marcherait
    Mais j'ai des sauts de ligne et je ne connais pas le nombre de ligne pour chaque chapitre. si c'est 10 lignes les infos que je veux sont toujours numero de chapitre et nom de participant, les autres informations je m'en moque, mais il peut s'agir de tout caractere sauf evidemment le mot chapitre. Evidemment il ne m'interesse pas de choper un numero de chapitre avec le nom du participant du chapitre d'a coté. Il me faut le couple (1, nestor), (2, robert) etc...

    la seule chose que je connais c'est le separateur entre les chapitres, qui est donc le mot chapitre.

    Et les assertions je n'y comprends pas grand chose. En tout cas si on arrive a gerer ces sauts de ligne, on dirait bien que ca repondra au besoin
    Grand merci

  4. #4
    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,

    je crois que ça dépend surtout comment tu lis ton fichier, soit il tient tout entier dans une variable que tu parse, soit tu le lis ligne par ligne et auquel cas le traitement n'est pas le même

    l'intégralité du fichier dans une variable (utilisation des switch /g et /s pour la regexp) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    local $/ = undef;
    my $s = <>;
    while ($s =~ /(chapitre \d).+?participant \"(.+?)\"/gs) {
       print $1 . " : " . $2 . "\n";
    }
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl pouet.pl fichier
    chapitre 1 : nestor
    chapitre 2 : robert
    ou bien en lecture ligne par ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    our $s;
    if ($_ =~ /(chapitre \d+)/) {
       $s .= $1 . " : ";
    } elsif ($_ =~ /participant \"(.+?)\"/) {
       print $s . $1;
       $s = "";
    }
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ perl -ln pouet2.pl fichier
    chapitre 1 : nestor
    chapitre 2 : robert

  5. #5
    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,

    je confirme ce qu'a écrit BufferBob: cette regex ne peut marcher que si tu as affecté l'ensemble du fichier à une variable scalaire, en "slurpant" le contenu du fichier dans cette variable (ce qui peut se faire, par exemple, en mettant à undef la variable spéciale $/) et en utilisant les modificateurs voulus (en particulier l'option g), dans une boucle.

    .

  6. #6
    Candidat au Club
    Homme Profil pro
    ingénieur logiciel
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur logiciel

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    je n'ai pas acces a perl pour ce besoin. j'ai acces a regex, donc et java.lang. Donc vous me dite qu'en regex seul, c'est pas trop faisable? java devrait permettre de, si je stocke tout le bazar dans une chaine de caracteres?
    Je sais j'ai peut-etre pas poste dans le bon forum. mais je prends toutes les idees

  7. #7
    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
    Citation Envoyé par bapi777 Voir le message
    je n'ai pas acces a perl pour ce besoin. j'ai acces a regex, donc et java.lang.


    java devrait permettre de, si je stocke tout le bazar dans une chaine de caracteres?
    à tester/voir avec les gens du forum Java, puisque pour corser le tout les regex Perl et Java n'ont ni les mêmes fonctionnalités ni tout à fait la même syntaxe (ici j'utilise le flag /gs pour rappel dans ma première solution) mais au flair ça doit quand même être faisable, le contraire serait étonnant

  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
    Il n'y a aucun doute que Java permet de stocker le contenu du fichier dans une longue chaîne de caractères. Cela ne pose aucune difficulté (quitte au pire à lire le fichier ligne par ligne et à concaténer chaque ligne dans une variable de chaîne).

    Je pense qu'il doit aussi être possible de mettre une regex comme celle que j'ai proposée ci-dessus, avec le modificateur "g", dans une boucle pour obtenir le même résultat que celui décrit en Perl, mais, là, je n'en suis pas absolument sûr et, surtout, je ne sais pas comment faire. Demande sur la rubrique Java du forum, tu auras sans doute des réponses pertinentes et utiles.

  9. #9
    Candidat au Club
    Homme Profil pro
    ingénieur logiciel
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur logiciel

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    tout compte fait cette regex fonctionne meme avec saut de ligne.
    ca m'evitera le java meme si j'attends une reponse coté java quand meme.

    chapitre\s+?(\d+)[\s\S]+?participant\s+"(\S+)"[\s\S]+?(?=chapitre)

    Merci a tous
    Cdt

  10. #10
    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,

    tant mieux si ça marche, mais je remplacerais tout de même les deux occurrences des sous-regex:
    par:
    qui est équivalent et tout de même un peu plus simple.

  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 Lolo78 Voir le message
    qui est équivalent et tout de même un peu plus simple.
    Elles ne sont équivalentes que si le motif "." est déclaré comme étant "tout caractère y compris un retour à la ligne", ce qui en perl, n'est pas la signication par défaut (il faut ajouter l'option /s pour 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

  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
    Exact, Philou (++), et tu fais bien de préciser, car c'est important dans le contexte.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/05/2008, 18h24
  2. Comment alterner un texte avec une image ?
    Par sircus dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/01/2008, 17h06
  3. [VBA] Comment valoriser un champ texte avec une variable ?
    Par Jean_Benoit dans le forum Access
    Réponses: 3
    Dernier message: 25/12/2006, 15h55
  4. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  5. Comment parcourir un fichier texte avec une boucle ?
    Par kikica dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2005, 17h13

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