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 :

regex qui retourne None


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut regex qui retourne None
    Bonjour,
    Je galère toujours autant avec les regex que j'utilise une fois par an...
    Ici, j'ai une chaine qui est extraite d'un fichier et je ne comprends pas pourquoi le retour est None : un problème de caractère spécial ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    chaine = """( * )  été remontées de la base._____________________________________________________________________________________________________________________________ N°9856959M. BASS--S L
     
    *9856959*
    Classe  ""
    """
     
    recherche3 = re.search(r"N°(.*?)Classe", chaine)
    Au final, je veux récupérer la sous-chaine BASS--S L sachant que dans nmon fichier, j'ai plein de lignes avec des N° différents.

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Je pense avoir une idée : peut-être parce que je lis le fichier avec :
    et qu'ensuite je fais ma recherche.
    Comme ma recherche porte sur plusieurs lignes, ça pourrait planter là ?

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Avec findall, j'ai l'impression que c'est plus concluant.
    Est-ce la solution la plus simple ?
    [edit] En fait, cela ne fonctionne pas non plus.

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    est-ce que tu as plusieurs valeurs à récupérer ? Si oui peux-tu nous montrer plusieurs lignes avec plusieurs valeurs à récupérer ?
    la chaine à récupérer est-elle toujours en fin de ligne après quelque chose qui ressemble à N°xxxxxxxxM.
    Ami calmant, J.P

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par marco056 Voir le message
    Je pense avoir une idée : peut-être parce que je lis le fichier avec :
    et qu'ensuite je fais ma recherche.
    Comme ma recherche porte sur plusieurs lignes, ça pourrait planter là ?
    Certes oui ça c'est déjà un bon point de départ.
    La syntaxe for lig in fichier est faite pour traiter des fichiers ayant des lignes (du caractère terminé par un '\n') et pour lesquelles chaque ligne constitue une information complète.

    Si l'information (et j'ai déjà eu le cas) commence à la ligne 3 et se termine à la ligne 7, fatalement tu ne peux plus utiliser la structure ci-dessus.

    Dans ce cas, la première chose à faire est de trouver comment identifier le début et la fin de l'information. Ensuite tu écris une fonction qui se charge de récupérer cette information dans le fichier sous forme itérative (donc elle te génèreinfo1, info2, info3 etc à la demande) et seulement à partir de là tu peux appliquer ta regex sur l'info traitée (et si en passant tu lui supprimes ses '\n' intermédiaires ça n'en est que mieux).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci à vous,
    j'ai essayé de testé vos propositions, sans succès.
    Effectivement, c'est un fichier très long dans lequel je dois récupérer plein d'informations.
    A la base, c'est un pdf que j'ai converti en txt.
    J'effectue mes recherches dans ce txt (j'espère ne pas être parti sur un pb XY...)
    Les infos que je recherche sont nombreuses et multiples.
    Je souhaite récupérer BIBI Camille dans
    ____________________ N°537M. BIBI Camille
    *537*
    Classe une classe au hasard
    puis plus loin BOBO Bertrand dans :
    ____________________ N°2212M. BOBO Bertrand
    *2212*
    Classe une classe au hasard
    Entre ces deux infos (en fait il y a plus de 200 noms à récupérer), j'ai aussi des valeurs à récupérer, par exemple :
    7 et 7 dans :
    Epreuves terminalesFrançais écrit7Français oral7PhilosophieInscritEpreuve orale terminale dite Grand OralInscritIngénierie, [/CODE]
    Cette partie, j'y suis parvenu.
    Par contre, certaines infos ne veulent pas se livrer, comme les valeurs numériques dans :
    [CODE]Appréciations des professeurs : (*) moyenne des notes des deux premiers trimestres de l'année de Terminale en cours. Eléments d™appréciation saisis par le professeur principal : Appréciation du chef d'établissement : Avis du chef d'établissement :DISCIPLINESAPPRECIATIONS GENERALESNote(*) etclassement del'élèveEffectif classeou groupeEnseignement moral etcivique Bon investissement dans la matière.12,519
    28Physique-Chimie etMathématiquesSpé Maths : Ensemble un peu juste.Spé Phys : sérieux.7,6223
    28PhilosophieTravail. Bonne participation en classe. Elève.
    9,1325
    J'espère avoir été plus clair...
    Je vais peut-être aller voir si je peux chercher directement dans le .pdf.

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    pour les noms tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     recherche3 = re.findall(r"M\.\s(.+)$", chaine,re.M)

  8. #8
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Ah oui ! Merci, cela semble fonctionner.
    J'étais parti à tester la bibliothèque tabula avec tabulate directement sur le pdf.

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    pour les noms tu peux essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     recherche3 = re.findall(r"M\.\s(.+)$", chaine,re.M)
    Par contre, pas facile à partir de là de récupérer les données entre les noms car pour certains noms, les données sont absentes.
    En tous cas, merci, cela me débloque déjà pas mal.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    donc si je reprends mon code, c'est une chose du type ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    classes = re.findall(r'N\°(.*?)\nClasse ', toutlefichier, re.DOTALL)
    for classe in classes:
        nom_classe = regex ("", classe, simpleligne)   # pour trouver type "BASS--S L"  , le regex de jurassic pork
        eleves = re.findall(r'eleve(.*?)/eleve ', classe, multilignes)
        for eleve in eleves:
            notes[eleve] = regex(eleve, multiligne?) # parse ligne à ligne ou regex
    faire des regex dans les résultats d'autres regex parentes pour avoir une structure

  11. #11
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par papajoker Voir le message
    donc si je reprends mon code, c'est une chose du type ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    classes = re.findall(r'N\°(.*?)\nClasse ', toutlefichier, re.DOTALL)
    for classe in classes:
        nom_classe = regex ("", classe, simpleligne)   # pour trouver type "BASS--S L"  , le regex de jurassic pork
        eleves = re.findall(r'eleve(.*?)/eleve ', classe, multilignes)
        for eleve in eleves:
            notes[eleve] = regex(eleve, multiligne?) # parse ligne à ligne ou regex
    Apparemment, pb avec l'instruction "regex"...

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marco056 Voir le message
    A la base, c'est un pdf que j'ai converti en txt.
    J'effectue mes recherches dans ce txt (j'espère ne pas être parti sur un pb XY...)
    Ben... Généralement on considère que toute conversion détruit (ou corromp) de l'information... surtout quand la conversion se fait depuis ensemble de départ plus riche (ici PDF) que l'ensemble d'arrivée (du TXT).

    Citation Envoyé par marco056 Voir le message
    Les infos que je recherche sont nombreuses et multiples.
    Je souhaite récupérer BIBI Camille dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ____________________ N°537M. BIBI Camille
    *537*
    Classe une classe au hasard
    Hoho... Tu veux récupérer la petite Bibi dans une classe? Es-tu certain de bien prendre en considération toutes les conséquences inhérentes au sens qu'on peut donner à cette phrase...?

    Citation Envoyé par marco056 Voir le message
    Je vais peut-être aller voir si je peux chercher directement dans le .pdf.
    https://www.datacorner.fr/pdf/
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par marco056 Voir le message
    Bonjour,
    Au final, je veux récupérer la sous-chaine BASS--S L
    pas compris, ta regex indique de No à Classesi tu désires que "BASS--S L" pas besoin de recherche mutiligne, et une lecture fichier ligne à ligne sans regex peut même faire l'affaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for line in fichier:
        if " N°" in line:   # a voir si suffisant
            match = line.rsplit(maxsplit=2)[-2:]
            print(match)
    si tout le fichier est chargé dans une variable "chaine"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    matches = re.findall(r'N°(.*?)\n', chaine, re.MULTILINE)
    matches = re.findall(r'N\°(.*?)\nClasse ', chaine, re.DOTALL)
    ta regex inclu aussi le numéro, mais ce n'était pas la question

  14. #14
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    J'effectue mes recherches dans ce txt (j'espère ne pas être parti sur un pb XY...)
    Pour avoir déjà eu ce genre de travail à faire, c'est la seule bonne méthode m'ayant permis d'avoir un travail efficace. En vrai, j'ai fais de l'interfaçage bash/python en m'appuyant du meilleur des deux mondes.

    Mais dans ton cas, ça semble devenir compliqué à la vue du formatage résultant d'un PDF -> txt

    Peut-être que d'autres formats seraient plus adaptés, mais il faut déjà tester, par exemple xml, html, qui utiliserait un module tel que lxml ou beautifulsoup ou ...

    Tu auras peut-être des modules Python dédiés à la lecture de PDF qui peuvent rendre plus facile l'analyse, faut encore une fois tester. De mon côté cette partie ne me permettait pas de répondre à la demande de temps d'exécution maximum.

    Sur le principe, je pense donc que ta solution n'est pas déconnant du tout !

Discussions similaires

  1. [10] select contenant une Regex qui ne retourne rien
    Par LFC dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/01/2020, 13h39
  2. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  3. Procedure stockée qui retourne un curseur
    Par kinaï dans le forum Débuter
    Réponses: 1
    Dernier message: 10/08/2004, 14h42
  4. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06
  5. Réponses: 14
    Dernier message: 09/04/2004, 13h44

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