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 :

Aide sur une Expression régulière [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Aide sur une Expression régulière
    Bonjour à tous,

    Voilà j'ai un soucis avec une expression régulière.

    Je cherche dans un texte tout les mots "toto" afin de les compter. Dans certains cas, toto peut être précédé d'un "$" ($toto) et je ne souhaite pas les comptabiliser.

    J'ai donc testé cette expression :

    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
     
    import re
     
    File = "toto.dat"
     
    f = open(File, "r")
    rf = f.read()
    f.close()
     
    reg = '^[A-Z]*toto'
     
    print rf
     
    res = re.findall(reg, rf)
     
    print len(res)
    et j'obtiens zéro pour le len(res).

    J'ai testé mon expression régulière dans Notepad à savoir ^[A-Z]*toto et il me compte bien les toto sans prendre en compte les $toto.

    Mon fichier toto.dat contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    titi tutu toto
    tutu $toto
    tata titi
    toto $ toto
    Est ce que vous voyez quelque chose qui ne va pas dans mon code qui fait que sous notepad l'expression régulière fonctionne, mais pas sous Python !

    Merci d'avance pour vos réponses !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    et j'obtiens zéro pour le len(res).
    Il faut lui dire "multiline" via l'ajout de l'option re.M
    Après reg = '^[A-Z]*toto', c'est "toto" précédé de 2 caractères: le premier n'étant pas dans [A-Z] et le second n'importe quoi.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.findall('(?:^|[^$])(toto)', 'toto titi toto coincoin tototo $toto $toto $totototo')
    ['toto', 'toto', 'toto', 'toto']
    (?:^|[^$]) "soit le début de la ligne, soit n'importe quel caractère qui n'est pas un $"
    le tout suivi de (toto), qu'on met entre parenthèses pour éviter de récupérer justement le caractère qui précède s'il y en a un

    note que j'ai inclus des cas limites, comme tototo par exemple, au final les 4 toto trouvés sont les suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto titi toto coincoin tototo $toto $toto $totototo

  4. #4
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.findall('(?:^|[^$])(toto)', 'toto titi toto coincoin tototo $toto $toto $totototo')
    ['toto', 'toto', 'toto', 'toto']
    (?:^|[^$]) "soit le début de la ligne, soit n'importe quel caractère qui n'est pas un $"
    le tout suivi de (toto), qu'on met entre parenthèses pour éviter de récupérer justement le caractère qui précède s'il y en a un

    note que j'ai inclus des cas limites, comme tototo par exemple, au final les 4 toto trouvés sont les suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto titi toto coincoin tototo $toto $toto $totototo
    Merci,

    surtout pour l'explication du pattern, c'est ce qui me bloque avec les expressions régulières et comme j'en fait pas tout les jours

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Il faut lui dire "multiline" via l'ajout de l'option re.M
    Après reg = '^[A-Z]*toto', c'est "toto" précédé de 2 caractères: le premier n'étant pas dans [A-Z] et le second n'importe quoi.

    - W
    Merci wiztricks j'ai réussi à résoudre mon problème.

    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
     
    import re
     
    File = "toto.dat"
     
    f = open(File, "r")
    rf = f.read()
    f.close()
     
    reg = '^[A-Z]toto|^[A-Z]TOTO'
     
    print rf
     
    res = re.findall(reg, rf, re.M)
     
    print len(res)
    je devais également prendre en compte le fait que ma chaîne recherché peut également être en majuscule, du coup j'ai adapté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reg = '^[A-Z]toto|^[A-Z]TOTO'

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    je devais également prendre en compte le fait que ma chaîne recherché peut également être en majuscule, du coup j'ai adapté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reg = '^[A-Z]toto|^[A-Z]TOTO'
    D'après ce que j'ai compris, le pattern '[^$] *toto' devrait être moins faux.
    Pour ignorer la casse, c'est comme pour multiligne, il suffit de le demander:
    re.findall(reg, rf, re.M + re.I)
    Citation Envoyé par nekcorp Voir le message
    surtout pour l'explication du pattern, c'est ce qui me bloque avec les expressions régulières et comme j'en fait pas tout les jours
    Beaucoup de choses sont dans le "how-to". Mais c'est vrai que sa lecture n'est pas d'un abord facile. Ceci dit, essayer de le (re)lire à chaque fois (parce qu'on ne retient pas tout) permet de se familiariser avec (à la longue).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    D'après ce que j'ai compris, le pattern '[^$] *toto' devrait être moins faux.
    Pour ignorer la casse, c'est comme pour multiligne, il suffit de le demander:
    re.findall(reg, rf, re.M + re.I)

    Beaucoup de choses sont dans le "how-to". Mais c'est vrai que sa lecture n'est pas d'un abord facile. Ceci dit, essayer de le (re)lire à chaque fois (parce qu'on ne retient pas tout) permet de se familiariser avec (à la longue).

    - W
    Effectivement ce pattern est fonctionnelle dans le cas ou il n'est pas possible de rencontrer autre chose que toto et $toto, si on a un #toto ou un _toto (ce qui peux arriver dans mon cas) alors ce n'est plus vrai. N'ayant pas détaillé tout les cas rencontré il reste à moi d’adapter vos suggestions à mes différentes situations.

    Merci pour l'astuce du re.I en tout cas je ne connaissais pas et je ne pensais même pas que çela existait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Aide sur une expression régulière
    Par steller dans le forum Langage
    Réponses: 3
    Dernier message: 08/02/2012, 13h54
  2. Demande d'aide sur une expression régulière
    Par bubulemaster dans le forum Débuter
    Réponses: 4
    Dernier message: 03/04/2008, 13h19
  3. Un peu d'aide sur une expression régulière particulier
    Par ruana dans le forum Général Python
    Réponses: 2
    Dernier message: 03/06/2007, 19h04
  4. [RegEx] Aide sur une expression régulière toute simple
    Par tchoumak dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h46
  5. Problème sur une expression régulière
    Par Verbal-Quint dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2004, 10h54

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