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

Python Discussion :

Extraction de multiples occurrences via les regex


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut Extraction de multiples occurrences via les regex
    Je souhaite extraire des zones en utilisant les Regex, mais je n'arrive pas à extraire la partie minimale :
    Soit la liste suivante :
    CEA
    AAA
    BBB
    CEB
    AAA
    BBB
    CED
    BBB
    CCC

    Mon but est de trouver un pattern pour extraire les 3 zones (CEx) indépendamment (3 pour l'exemple mais dans le fichier d'origine il y a x zones) :
    CEA AAA BBB
    CEB AAA BBB
    CED BBB CCC

    Le pattern suivant extrait la totalité des 3 zones (CE[\w][\w\n]*)

    Si vous avez des idées, je suis preneur.

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    J'ai pas bien compris.

    Pourquoi as tu une liste d'1 élément sur 9 lignes puis une de 3 éléments sur 3 lignes ?

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    C'est vrai que ce n'est pas très clair. Disons que si tu as un fichier que tu charges intégralement dans une variable et que tu veuilles obtenir une chaîne, tu pourrais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $str = 'CEA
    AAA
    BBB
    CEB
    AAA
    BBB
    CED
    BBB
    CCC';
     
    echo preg_replace('~\R(?!CE)~', ' ', $str);
    (remplacer les sauts de lignes non suivis de CE par un espace). Ce qui correspond à ton affichage.

    Si tu veux simplement extraire des blocs de ton fichier, dans ce cas, lis-le ligne par ligne et détecte les lignes commençant par CE pour démarrer un nouveau bloc. Pas besoin de regex pour faire ça.

    Mais on ne sait pas si tu veux obtenir une chaîne, un tableau de chaîne ou un tableau de tableau de chaîne.

    Décris mieux ton problème, car il y a potentiellement des manières plus élégantes de faire ce que tu souhaites.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut
    Bonjour
    Merci pour vos réponses rapides.
    1/ Le fichier texte est constitué de plusieurs blocs.
    2/ Chaque bloc commencer par CEx et est composé de plusieurs lignes.
    3/ On peut détecter la fin du bloc CEx par le début du bloc suivant CEy

    Actuellement je parcours le fichier en recherchant le début de ligne CEx jusqu'à la détection du début du bloc suivant : cela fonctionne correctement.
    Mon objectif est de voir s'il est possible, en utilisant un seul pattern regex + conditions (?<= ; ?!...), d'extraire directement les différents blocs

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Ta technique actuelle est très bien. Tu peux obtenir le même résultat en utilisant la même pattern que précédemment en chargeant tout le contenu du fichier dans une variable, mais avec preg_split (je suppose que le fichier commence par CE):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = preg_split('~\R(?=CE)~', $str);
    Si le fichier ne démarre pas directement par un bloc, tu peux utiliser preg_match_all mais avec une pattern un peu plus complexe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( preg_match_all('~^CE(?>.*\R?)*?(?=CE|\z)~m', $str, $m) ) {
        $result = $m[0];
    }
    ou alors plus court (un peu moins guidée) mais moins efficace si les blocs sont longs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( preg_match_all('~^CE.*?(?=^CE|\z)~ms', $str, $m) ) {
        $result = $m[0];
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 13
    Par défaut
    Merci, c'est exactement ce que je recherche !!
    Reste à trouver une librairie Python compatible PCRE

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Si tu as beaucoup de blocs et que tu veux éviter d'avoir à stocker l'intégralité du fichier dans une variable, puis de stocker ensuite tous les blocs trouvés dans une autre, tu peux utiliser une fonction générateur:
    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
    function genBlocks($handle) {
        while ( false !== $line = fgets($handle) ) {
            if ( strpos($line, 'CE') === 0 ) {
                if ( !empty($tmp) )
                    yield $tmp;
     
                $tmp = $line;
            } else {
                $tmp .= $line;
            }
        }
     
        if ( !empty($tmp) )
            yield $tmp;
    }
    Ainsi tu peux effectuer tes traitements ultérieurs sans que la taille du fichier ou le nombre de blocs n'impactent la mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $handle = fopen('monfichier.txt', 'r');
    $blocks = genBlocks($handle);
     
    foreach ($blocks as $block) {
        // traitement sur $block
    }

Discussions similaires

  1. Manipulation avancée d'un texte via les regex
    Par verredewhisky dans le forum Contribuez
    Réponses: 1
    Dernier message: 16/02/2013, 19h50
  2. [RegEx] Extraction des mot dans un paragraph avec les REGEX
    Par geforce dans le forum Langage
    Réponses: 0
    Dernier message: 29/03/2010, 18h58
  3. [RegEx] Encore les regex
    Par Joelindien dans le forum Langage
    Réponses: 8
    Dernier message: 03/04/2009, 19h26
  4. Accès à l'évènement "OnAuthorize" via les hooks
    Par mchicoix dans le forum XMLRAD
    Réponses: 8
    Dernier message: 09/03/2005, 22h52
  5. envoie de fichiers via les formulaires
    Par fabogranqi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 10/10/2004, 21h34

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