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 :

Passage algo - code pour génération d'expressions régulières [Fait]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Passage algo - code pour génération d'expressions régulières
    Bonjour tout le monde!

    Pour ceux qui se souviennent, je suis toujours dans ma fonction de génération d'expressions régulières mais je suis en passe de réussir...seulement me voilà confronter à un nouveau problème (le dernier, j'espère!).

    Voilà, je voudrais remplacer une lettre suivant une étoile ou un chiffre par se majuscule et sa minuscule entre crochets. Je mets un exemple.
    J'ai:
    5[^A-Za-z]*HT[^A-Za-z]*1A
    Et je veux obtenir:
    5[^A-Za-z]*[Hh]T[^A-Za-z]*1[Aa]
    Je pense que c'est pas bien compliqué mais là je sèche complètement...

    Merci pour votre aide!

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import re
    >>> txt = "5[^A-Za-z]*HT[^A-Za-z]*1A"
    >>> repl = lambda match: match.group(1) + "[" + match.group(2).upper() + match.group(2).lower() + "]"
    >>> re.sub(r"(\*|\d)([A-Za-z])", repl, txt)
    '5[^A-Za-z]*[Hh]T[^A-Za-z]*1[Aa]'
    Normalement c'est bon

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Après avoir adapté ce que tu viens de me filer...ça marche nickel! J'ai rien changé, juste mis dans une fonction! Par contre, j'ai rien compris du fonctionnement avec les "match".
    Tu peux m'expliquer comment marche tout ça stp?

    Merci

    deedoo...

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    En fait la fonction re.sub peut admettre comme deuxième paramètre une fonction qui prend un paramètre: un match object décrivant la portion de chaîne correspondant au motif et qui renvoie une chaîne correspondant au remplacement

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    En fait, j'ai pas compris le coup du 'lambda' avec les groupes et les chiffres, ni le 'r"(\*|\d)"!

    Sinon j'ai une autre question, comment peut-on faire pour supprimer une partir de string en plein milieu? La partie que je veux supprimer sera toujours entre parenthèses. J'ai bien pensé faire une recherche de parenthèses et supprimer de celle ouvrante à celle fermante mais le passage au code bloque!!!
    Par exemple:
    str="bla|bla bla (truc bidule-machin) bla-blabla"
    Et obtenir:
    str="bla|bla bla bla-blabla
    Merci

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Déjà le "r" au début c'est pour le raw string (en clair pas de remplacement des codes de caractères comme \n, \r, \t etc, ce qui permet de ne pas avoir à échapper les antislash)
    Ensuite le "(\*|\d)" ça représente en fait soit un chiffre (\d) soit une étoile, les parenthèses c'est pour "capturer" ce caractère
    Tout ce qui est entre parenthèses (sauf extension des parenthèses décrites dans la doc) sera accessible à partir du match object par la méthode group, group(0) représente la chaîne entière, ensuite les groupes sont répertoriés dans l'ordre où ils apparaissent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import re
    >>> str = "bla|bla bla (truc bidule-machin) bla-blabla"
    >>> re.sub(r"\(.+?\)", "", str)
    'bla|bla bla  bla-blabla'
    Ou si l'espace doublé ne te convient pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.sub(r"\(.+?\) ", "", str)
    'bla|bla bla bla-blabla'

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    C'est bon ça marche...merci de l'aide et des explications!

    deedoo...

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

Discussions similaires

  1. [RegEx] Aide pour finaliser une expression régulière
    Par [ZiP] dans le forum Langage
    Réponses: 3
    Dernier message: 16/10/2013, 22h25
  2. Besoin d'aide pour remplacer avec expression régulière sur plusieurs lignes
    Par MediaVistaIntel dans le forum Général Python
    Réponses: 11
    Dernier message: 01/12/2011, 14h19
  3. [RegEx] Problème pour concevoir une expression régulière
    Par lokicorp dans le forum Langage
    Réponses: 5
    Dernier message: 08/07/2011, 13h12
  4. Gestionnaire de versions de code pour Visual Basic Express
    Par Thaloman dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/11/2009, 19h02
  5. Réponses: 15
    Dernier message: 02/07/2009, 10h12

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