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 :

remplacements via regexp


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut remplacements via regexp
    Bonjour,

    J'aimerai faire un petit script python pour corriger des erreurs classiques liées à de l'OCR.
    Le caractère 'l' est souvent identifié par 'I' selon la police de caractères.

    J'ai regardé via le module re. Je pense être prêt de la solution mais je bloque.

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    re.sub('[a-z]+I+[a-z]+', 'l', 'La beIIe bouIe bleu sur Ie persiI vert. Il ...')
    Voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La l l bleu sur Ie persiI vert. Il ...
    Il repère bien une partie des bons mots mais le replacement est foireux.

    Une idée ?

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.sub('I', 'l', 'La beIIe bouIe bleu sur Ie persiI vert. Il ...')

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    re.sub('I', 'l', 'La beIIe bouIe bleu sur Ie persiI vert. Il ...')
    ce bout de code donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La belle boule bleu sur le persil vert. ll ...
    A la limite un str.replace() aurait suffit. Mais le problème c'est que tous les 'I' ne sont pas forcément des 'l'

    Je souhaite procéder comme ceci :
    - identifier les mots dont un 'I' est entouré d'au moins une lettre minuscule.
    - les corriger

    Je pense que ça va supprimer plus de 70% des problèmes.
    Pour les mots commençant et finissant par I, ce sera difficile de savoir si c'est un nom propre ou autres chose. Donc ce sera une correction manuelle.

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Je te propose plutôt d’utiliser les lookahead/lookbehind, qui ont l’avantage de na pas consommer, donc de ne pas être remplacés par sub*!

    Voici ma proposition, qui change en l*:
    * Un I précédé d’une minuscule ou d’un autre I (très rare d’avoir deux II, et ça permet de s’occuper du cas du double ll…);
    * Un I non-précédé d’un ., ! ou ? avec espace, et suivi d’une minuscule ou d’un autre I (le lookbehind négatif permet de ne pas transformer les I de début de phrase en l).

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    re.sub(r'(?<=[a-zI])I|(?<![.!?] )I(?=[a-zI])', r'l', 'La beIIe bouIe bleu sur Ie persiI vert. Il ...')

    Note que cela reste de toute façon fort imparfait, il y a trop de possibilités différentes pour que ça le soit*!

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Merci mont29, c'est ce que je cherchais.

    J'ai cependant une question sur le code :

    Pourquoi le 'r' devant les expressions ?

    Concernant les lookahead/lookbehind, j'ai regardé sur le net histoire de comprendre comment ça fonctionne, ça m'a l'air assez obscure comme truc...

  6. #6
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Le r devant une chaîne python indique qu’il s’agit d’une chaîne raw (brute), c’est à dire que les séquences d’échappement (genre \n pour aller à la ligne) sont retranscrites littéralement, et non interprétées. Cela t’évite d’avoir à échapper les backslashes à tout bout de champ*!

    Concernant les lookahead/lookbehind, ce n’est pas si compliqué que ça, il s’agit simplement de voir si ce qui est “matché” par le motif “normal” est (ou pas) immédiatement précédé/suivi de quelque chose qui “matche” le motif contenu dans le lookbehind/lookahead…

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

Discussions similaires

  1. Split via Regexp
    Par guich62 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 13/07/2011, 11h45
  2. Chercher/remplacer via vba
    Par needlesurfer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/05/2009, 12h03
  3. Suppression de caractère via RegExp
    Par totoche dans le forum Vos contributions VB6
    Réponses: 1
    Dernier message: 29/12/2008, 13h01
  4. remplacement via awk (jawk)
    Par gomodo dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 06/10/2008, 09h00
  5. [MySQL] recherche de mots via REGEXP : problème d'accents
    Par matperino dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/10/2006, 21h48

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