regexp et caractères accentués

Le
Thomas vO
bonjour,

je suis en train de chercher un motif me permettant de transposer un
caractère accentué en [le même caractère non accentuÃ=
©] et j'aimerais
bien éviter de me peler la liste à la main

j'essaie des trucs genre :
perl -e '$a="créer";$a=~s/(PMpM+)//g;print $a' -> "créer"

alors que (normal) :
perl -e '$a="créer";$a=~s/(PMpM*)//g;print $a' -> ""

pourtant, d'après ce que je comprends de la doc, (PMpM+) devrait
'matcher' [tout sauf un accent] suivi de [au moins un accent], non ?

j'ai demandé à Google s'il connaissait pas, mais apparemment, non=
(ou
alors je lui ai pas donné les bons mots-clefs).

merci pour toute piste,

--
Thomas vO
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #17945851
Thomas vO wrote in message
perl -e '$a="créer";



Tel quel, $a contient une chaîne d'octets. Les prédicats fonctionnant sur
les chaînes de caractères Unicode ne fonctionnent donc pas correctement,
seulement en mode dégradé sur l'ASCII.

Il faut donc déjà remédier à ça : use utf8 pour les chaînes directement
écrites dans le script, binmode ":utf8" (ou :encoding(...)) pour les chaînes
venant d'un filehandle, et Encode::decode pour le reste.

$a=~s/(PMpM+)//g;print $a' -> "créer"

alors que (normal) :
perl -e '$a="créer";$a=~s/(PMpM*)//g;print $a' -> ""



De toutes façons, ce que tu fais est faux : tu enlèves les accents (pM*),
mais tu enlèves aussi le caractère sur lequel ils se trouvent (le PM
lui-même). Il faut soit écrire s/(PM)pM+/$1/g (pour remplacer le caractère
accentué par sa version de base), soit plus simplement s/pM//g (pour
supprimer tout simplement les accents).

L'autre erreur que tu fais, c'est que ta chaîne (en supposant que tu aies
corrigé le premier point) contient le caractère [e accent aigu], pas la
paire de caractères [e] [accent aigu]. Le prédicat pM ne s'applique donc
pas. La première étape consiste donc à décomposer le caractère, ce qui est
le rôle des fonctions Unicode::NFD et Unicode::NFKD (qui sont subtilement
différentes).
Thomas vO
Le #17946011
merci pour les indications,

À (at) 24 Nov 2008 14:23:38 GMT,
Nicolas George
$a=~s/(PMpM+)//g;print $a' -> "créer"

alors que (normal) :
perl -e '$a="créer";$a=~s/(PMpM*)//g;print $a' -> ""



De toutes façons, ce que tu fais est faux : tu enlèves les accents
(pM*), mais tu enlèves aussi le caractère sur lequel ils se
trouvent (le PM lui-même). Il faut soit écrire s/(PM)pM+/$1/g
(pour remplacer le caractère accentué par sa version de base), soit
plus simplement s/pM//g (pour supprimer tout simplement les
accents).



en effet ; restes de tests...

L'autre erreur que tu fais, c'est que ta chaîne (en supposant que tu
aies corrigé le premier point) contient le caractère [e accent
aigu], pas la paire de caractères [e] [accent aigu]. Le prédica t pM
ne s'applique donc pas. La première étape consiste donc à décomposer
le caractère, ce qui est le rôle des fonctions Unicode::NFD et
Unicode::NFKD (qui sont subtilement différentes).



il existe des modules Perl pour ça ? je trouve seulement pour C ou Jav a...

--
Thomas vO
Nicolas George
Le #17946431
Thomas vO wrote in message
il existe des modules Perl pour ça ? je trouve seulement pour C ou Java...



Quand j'écris « Unicode::NFD », ça parle du module Unicode. Qui fait partie
de la distribution standard.
espie
Le #17946421
In article Nicolas George
Thomas vO wrote in message
il existe des modules Perl pour ça ? je trouve seulement pour C ou Java...



Quand j'écris « Unicode::NFD », ça parle du module Unicode. Qui fait partie
de la distribution standard.



Ou ca ?
J'ai deux perl 5.10 sous la main. Aucun des deux ne me renvoie quoi que ce
soit sur un perldoc Unicode
Nicolas George
Le #17946411
Marc Espie wrote in message
Ou ca ?
J'ai deux perl 5.10 sous la main. Aucun des deux ne me renvoie quoi que ce
soit sur un perldoc Unicode



Au temps pour moi, ma mémoire m'a joué des tours : c'est
Unicode::Normalize::NFD et ...::NFKD.
Paul Gaborit
Le #17946551
À (at) 24 Nov 2008 15:06:26 GMT,
Nicolas George
Thomas vO wrote in message
il existe des modules Perl pour ça ? je trouve seulement pour C ou Java...



Quand j'écris « Unicode::NFD », ça parle du module Unicode. Qui fait partie
de la distribution standard.



Heu... ?!?

Personnellement, j'utilise les fonctiosn du module Unicode::Normalize :
ce sont NFD, NFC, NFKD et NFKC.

À ma connaissance, il n'existe pas de module Unicode...

--
Paul Gaborit - Perl en français -
M
Le #17949131
Thomas vO a écrit :
bonjour,

je suis en train de chercher un motif me permettant de transposer un
caractère accentué en [le même caractère non accentué] et j'aimerais
bien éviter de me peler la liste à la main...

j'essaie des trucs genre :
perl -e '$a="créer";$a=~s/(PMpM+)//g;print $a' -> "créer"

alors que (normal) :
perl -e '$a="créer";$a=~s/(PMpM*)//g;print $a' -> ""

pourtant, d'après ce que je comprends de la doc, (PMpM+) devrait
'matcher' [tout sauf un accent] suivi de [au moins un accent], non ?

j'ai demandé à Google s'il connaissait pas, mais apparemment, non (ou
alors je lui ai pas donné les bons mots-clefs...).

merci pour toute piste,




Bonsoir,

J'ai été confronté à un problème avec perl et unicode, je cherchais les
caractères accentués. Après avoir appelé les mongueurs de Genève à
l'aide, contrôlé le fichier de données, l'environnement, nous avions trouvé:

Le fichier était bon, mais en effet Perl n'utilise pas par défaut
unicode pour ses fichiers standards. "-C7" sur la ligne de commande le
force, ou la variable d'environnement "PERL_UNICODE=7".
Voir perlrun: http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perlrun.pod

Salutations.
mpg
Le #17951391
Le (on) lundi 24 novembre 2008 15:23, Nicolas George a écrit (wrote) :

L'autre erreur que tu fais, c'est que ta chaîne (en supposant que tu aies
corrigé le premier point) contient le caractère [e accent aigu], pas la
paire de caractères [e] [accent aigu]. Le prédicat pM ne s'applique donc
pas. La première étape consiste donc à décomposer le caractère, ce qui est
le rôle des fonctions Unicode::NFD et Unicode::NFKD (qui sont subtilement
différentes).



Wha, super, ce fil et notamment la mention d'Unicode::Normalize répond à une
question que je me posais depuis pas mal de temps. Merci à tous.

Manuel.
Publicité
Poster une réponse
Anonyme