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 :

(encore) un problème avec les regexp (un peu subtile celui-là)


Sujet :

Python

  1. #1
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut (encore) un problème avec les regexp (un peu subtile celui-là)
    Bonjour,

    je cherche à extraire un bout de chaîne entre accolades : un truc simplissime !
    Sauf que là, j'observe un comportement qui ne me convient pas du tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import re
    >>> r = re.compile('(.*){(.*)}(.*)')
    >>> e = r.match('{123}456{789}')
    >>> e.groups()
    ('{123}456', '789', '')
    Ce nigaud match avec la 2° chaîne entre accolades.
    Comment le forcer à matcher la première ?
    --> j'aurais aimé qu'il me réponde ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> e.groups()
    ('', '123', '456{789}')
    J'ai essayé avec "^(.*){(.*)}(.*)$", mais ça ne change rien.
    J'ai beau scruter les docs, je ne trouve rien d'assez précis pour résoudre mon petit problème...
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    L'un des pb de ton code, c'est que .* veut dire n'importe quel caractère, donc y compris les '{' et '}'.

    Voilà un motif qui donne le résultat que tu souhaites:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    r = re.compile(r'([^{]*){(\d*)}(.*)')
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut

    ra la la... quel boulet
    j'aurais dû y penser...

    en fait (attention : excuse vaseuse) je cherchais plutôt du coté des flags.
    Je me disais qu'il y avait peut être un flag qui force le matching le + tôt/tard possible.
    Dans ma lointaine jeunesse j'avais écrit un module de regex qui supportait ce genre d'option...

    Merci.
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  4. #4
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Petite rectification : c'est un peu plus compliqué parce que mes délimiteurs ne sont pas { et } (c'était pour l'exemple) mais <<< et >>>.
    Du coup, la reg exp qui joue le rôle de "([^{]*){" est un peu plus compliquée (bien sûr "([^<]*)<<<" ne suffit pas).
    Mais c'est alors que j'ai eu l'idée de me servir de mon cerveau !
    Pourquoi s'enquiquiner avec des regexp ?
    Un petit algo à base de split('<<<',1) et split('>>>',1) fait exactement ce que je veux, sans regexp !
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

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

Discussions similaires

  1. [RegExp] Petit problème avec les integers
    Par Rhend dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/10/2011, 20h19
  2. Encore un problème avec les tableaux
    Par george216 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 13
    Dernier message: 18/05/2009, 18h21
  3. Problème avec les Regexp
    Par Hellnino18 dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 06/03/2009, 10h07
  4. Réponses: 3
    Dernier message: 10/09/2008, 14h24
  5. [VBA-E] Encore un problème avec les limites de RANGE
    Par durdesfois dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/07/2007, 20h56

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