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 :

Substitution de paires de chaînes de caractères distantes dans un texte [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut Substitution de paires de chaînes de caractères distantes dans un texte
    Bonjour,
    Grand commençant dans python, je cherche à substituer dans un texte et en même temps, toutes les occurrences de 2 chaînes de caractères distantes.

    Par exemple : substituer les balises {{{** et }}} par les balises [h2] et [/h2]
    sachant qu'il existe ailleurs des paires de balises {{{ et }}} auxquelles je ne veux pas toucher.


    {{{** MonTitre1 }}} deviendrait [h2] MonTitre1 [/h2]
    {{{** MonTitre2 }}} deviendrait [h2] MonTitre2 [/h2]
    {{{ texte }}} resterait {{{ texte}}}
    etc.

    Pour l'instant, je n'ai réussi qu'à :
    - commander l'ouverture et la lecture du fichier texte source entree.txt
    - placer le texte dans une variable "machaine"
    - substituer des caractères dans le texte
    - écrire "machaine" transformée dans un fichier texte sortie.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    machaine = open("/home/MX/Documents/ECRITURE/entree.txt", "r").read()
     
    machaine = machaine.replace('--','—')
     
    fichier = open("/home/MX/Documents/ECRITURE/sortie.txt", "w")
    fichier.close()
     
    fichier = open("/home/MX/Documents/ECRITURE/sortie.txt", "a")
    fichier.write(machaine)
    fichier.close()
    fichier.close()

  2. #2
    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,

    une méthode consiste à utiliser des expressions rationnelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> import re
    >>> re.sub(
    ...    r'\{\{\{\*\*(.*?)\}\}\}',                 # motif (regex)
    ...     '[h2]\\1[/h2]',                          # par quoi on remplace
    ...     '{{{**bouzin}}} pouet {{{**coincoin}}}'  # sur quoi on remplace
    ... )
    '[h2]bouzin[/h2] pouet [h2]coincoin[/h2]'
    note que les caractères spéciaux comme { ou * doivent être échappés (respectivement en \{ et \* donc)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    Merci beaucoup. C'est parfait

    Pour ceux que ça peut intéresser, le code final qui fonctionne :
    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
     
    machaine = open("/home/MX/Documents/ECRITURE/entree.txt", "r").read()
    machaine = machaine.replace('--','—')                                 # Substitution classique dans le texte contenu dans la variable machaine
                                                                          # des caractères -- par le caractère —
    machaine=re.sub(r'\{\{\{\*\*(.*?)\}\}\}','[h2]\\1[/h2]', machaine)    # Substitution dans le texte contenu dans la variable machaine
                                                                          # des chaînes {{{** et }}} par les chaînes [h2] et [/h2] 
     
    fichier = open("/home/MX/Documents/ECRITURE/sortie.txt", "w")
    fichier.close()
     
    fichier = open("/home/MX/Documents/ECRITURE/sortie.txt", "a")
    fichier.write(machaine)
    fichier.close()
    fichier.close()

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Concernant l'accolade ouvrante {, elle fait bien partie des caractères spéciaux, mais son échappement n'est nécessaire que lorsque le contexte l'exige (par exemple quand elle risque d'être prise pour le début d'un quantificateur {m} ou {m,n}). Par contre l'accolade fermante n'est pas un caractère spécial, il est inutile de l'échapper.

    Donc on peut très bien écrire: r'{{{\*\*(.*?)}}}'

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/03/2014, 14h08
  2. Réponses: 2
    Dernier message: 30/04/2010, 20h40
  3. Chaîne contenant caractère spécial dans clause CONTAINS
    Par Macadoshis dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 25/08/2008, 10h03
  4. Réponses: 3
    Dernier message: 24/10/2007, 01h47
  5. Convertir une chaîne de caractère (saisie dans un textbox) en décimal
    Par sab_etudianteBTS dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/09/2007, 21h17

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