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

Langage Perl Discussion :

Regex : ignorer les diacritiques ?


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut Regex : ignorer les diacritiques ?
    Ma question est théorique, elle vient d'une réflexion qui m'est passée par la tête pour un projet sur lequel je travaille. Existe-t-il un moyen simple d'ignorer les diacritiques (accents, cédilles, etc) dans une expression régulière en Perl ? L'idée étant de pouvoir reconnaître un "e" dans la chaîne examinée, même si le caractère est un "é", un "è", un "ë", etc.
    Est-ce possible simplement ? Et si non, est-ce en projet ?

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    perso

    je ferais un prétraitement qui consiste à remplacer tous les caracters accentué par leur equivalent non accentué.

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Autrement il semble que cela fasse partie des questions fréquentes sur pas mal de site.


    http://www.perlmonks.org/?node_id=648332

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    On peut aussi imaginer un prétraitement du motif plutôt que des chaines à comparer (effectué une seule fois quand à lui), qui modifie les caractères pouvant présenter des diacritiques par des classes de caractères qui englobe toutes les variantes des diacritiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern =~ s/e/[eéêèë]/g;

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Comment un caractère accentué est-il codé en UTF8 ? N'y aurait-il pas une partie du codage pour l'accent ?
    Bref, je n'en sais rien, mais je vais suivre cette discussion, le problème étant effectivement plu que récurrent au niveau des regex, et ceci dans tous les langages.

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    l'utf-8 comme l'ascii est une norme qui permet de définir une correspondnace entre un jeu de caractère humainement compréhanesible et un octet.

    http://terroirs.denfrance.free.fr/p/...ode_utf-8.html

    par exemple en utf-8 A=65,
    e=101
    ¨tous les e avec des accentes sont entre 231 et 235

  7. #7
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Text::Unaccent et Text::Unaccent::PurePerl (pour ceux qui n'arrivent pas à installer le premier) permettent de retirer tous les accents d'un texte.

    Si vous voulez garder votre texte avec accent mais pouvoir examiner le caractère de base indépendamment de son accent, vous pouvez utiliser les formes standards d'unicode avec Unicode::Normalize :
    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
    17
    18
    19
    20
    21
    22
    23
    #!/usr/bin/perl
    use strict; use warnings;
    use utf8; use 5.10.0;
     
    my ($codepage) = (`chcp` =~ m/:\s+(\d+)/);
    foreach my $h ( \*STDOUT, \*STDERR, \*STDIN ) {
      binmode $h, ":encoding(cp$codepage)";
    }
     
    say "Essayons les entrées-sorties : ";
    my $input = <>;
     
    use Unicode::Normalize;
    $input = NFD($input);
    print "Votre entrée : " . NFC($input);
     
    my $count_of_e =()= ($input =~ m/e/g);
    say "Il y a $count_of_e 'e' dans votre entrée";
     
    my $count_of_accented_e =()= ($input =~ m/e\pM+/g);
    say "Il y a $count_of_accented_e 'e' avec un accent dans votre entrée";
     
    __END__
    Citation Envoyé par jabbounet
    l'utf-8 comme l'ascii est une norme qui permet de définir une correspondnace entre un jeu de caractère humainement compréhanesible et un octet.
    Cette description est incorrecte à plusieurs titres : d'une part utf-8 n'établit pas de correspondance entre un jeu de caractère et un encodage numérique, c'est Unicode qui s'en charge, utf-8 n'est qu'une façon de stocker une suite de nombres entiers en binaire, d'autre part certains de ces caractères prennent plus d'un octet à stocker.

    Citation Envoyé par s.n.a.f.u.
    Comment un caractère accentué est-il codé en UTF8 ? N'y aurait-il pas une partie du codage pour l'accent ?
    Comme établit plus haut, l'utf-8 ne dit pas comment coder un caractère, Unicode le dit, et en fait Unicode offre plusieurs possibilités pour coder certains caractères, par exemple la forme D stocke séparément le caractère et ses modificateurs tandis que la forme C préconise de stocker les combinaisons courantes comme un seul nombre si possible.
    'é' est donc soit 233 (forme C), soit 101 + 769 (forme D).

    --
    Jedaï

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    oui effetivmement l'encodage utf-8 prend entre 1 et 4 octets...

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/08/2005, 17h11
  2. Réponses: 7
    Dernier message: 25/07/2005, 13h41
  3. [pgAdminIII] Comment ignorer les erreurs de script
    Par Escandil dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 22/07/2005, 12h03
  4. Le linker ignore les fonctions non implémentées
    Par Rodrigue dans le forum C++Builder
    Réponses: 5
    Dernier message: 02/03/2005, 13h31

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