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 :

Remplacement chaine exacte comportant des accents [Débutant(e)]


Sujet :

Python

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut Remplacement chaine exacte comportant des accents
    Bonjour,

    Je suis en difficulté avec les regex :
    je voudrais remplacer certains mots par des étiquettes du style <MOT>israélien</MOT>, mais le découpage ne se fait pas sur le mot exact. Dans mon texte, j'ai «israélien» et «lien», ce qui fait un découpage israé<MOT>lien></MOT> au lieu de <MOT>israélien></MOT> !!
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    texte = "espagnol et israélien. Voici le lien."
    mots = ["espagnol","israélien","lien"]
    for mot in mots:
          avant = r''\b''+mot+r''\b''
          apres = r''<MOT>''+mot+r''</MOT>''
    texte = re.sub(avant,apres,texte)
    print texte
    Est-il possible d'avoir un vrai découpage sur les mots ? Je pensais que les \b suffisaient pour ne pas avoir de problèmes. Si je supprime l'accent sur israélien, il n'y a plus de problème donc c'est sûrement l'accent qui bloque. Mais je ne vois pas comment faire...

    Merci à vous

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Ajoute une espace avant 'lien' pour le différencier de la fin de 'israélien'.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut
    Bonjour et merci pour ta réponse.

    J'ai tenté l'espace, ça marche pour l'exemple que j'avais donné mais comme les espaces ne sont pas toujours présent (oubli d'espaces après certains signes de ponctuation / titres / apostrophe "l'israélien"), ça coince de nouveau.

    J'ai vu que je pouvais faire un test pour savoir si la chaine était accentuée ou non avec isalpha() qui me renvoie FALSE pour les mots accentués.
    Du coup, ça me permet de faire un cas spécifique pour les mots accentués qui sont les seuls à poser problème.

    Je pensais détailler tous les cas possibles, mais quand je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    avant = r"\'"+mot+r"\b"    
    apres = r"\'<MOT>"+mot+r"</MOT>"

    pour le cas avec apostrophe, ça ne fonctionne pas (que je mette ou non le slash, le "r" ou le \b d'ailleurs)

    Si vous avez d'autres idées, merci beaucoup !!

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut,
    J'ai essayé en ajoutant le flag unicode à la regex, et en préfixant les chaines d'un "u", et en jouant sur locale, mais ça ne fonctionne pas avec la version de la branche 2 (2.6). Un bug ?
    Par contre, ça fonctionne correctement avec la branche 3.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Tu dois traiter chaque mot du texte par rapport à ta liste et non pas le contraire.

    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> texte = u"espagnol et israélien. Voici le lien."
    >>> mots = [u"espagnol", u"israélien", u"lien"]
    >>> tokens = texte.split()
    >>> for idx, l in enumerate(tokens):
    ...     if l in mots:
    ...             tokens[idx] = u"<MOT>%s</MOT>" % l
    ... 
    >>> text = u" ".join(tokens)
    >>> text
    u'<MOT>espagnol</MOT> et isra\xe9lien. Voici le lien.'
    montre le principe mais montre aussi le problème des mots qui finissent une phrase, ta liste de mots devrait donc aussi considérer les variantes avec point ou toute autre ponctuation et, éventuellement, majuscule ...etc.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Sinon, il suffit d'activer le flag re.U[NICODE] avec Python2.7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $  python2.7
    Python 2.7.10 (default, Jan 15 2016, 14:56:07) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import re
    >>> txt = u"espagnol et israélien. Voici le lien."
    >>> for mot in [u"espagnol", u"israélien", u"lien"]:
    ...     txt = re.sub(ur'\b(%s)\b' % (mot), ur'<MOT>\1</MOT>', txt, flags=re.U)
    ... 
    >>> txt
    u'<MOT>espagnol</MOT> et <MOT>isra\xe9lien</MOT>. Voici le <MOT>lien</MOT>.'

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut
    Merci à tous les deux VinSs et Dardanos,

    Je retiens la dernière solution : ça fonctionne et pas besoin de spécifier les différents cas.
    Bref, super !!

    Encore merci

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

Discussions similaires

  1. [Python 2.X] Envois d'email comportant des accents avec python
    Par tolliob dans le forum Général Python
    Réponses: 6
    Dernier message: 13/08/2015, 08h13
  2. [ODBC] Requete sql vers access impossible avec champ comportant des accents
    Par roxxsuxx dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2012, 11h17
  3. [DW MX2004] Remplacement automatique des accents
    Par mandaillou dans le forum Dreamweaver
    Réponses: 9
    Dernier message: 10/07/2008, 15h31
  4. disparition des accents dans une chaine string
    Par marco62118 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/03/2006, 00h19
  5. [Configuration] probleme avec le remplacement des accents
    Par xtaze dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/12/2005, 19h16

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