Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

regexp et caractères accentués

8 réponses
Avatar
Thomas vO
bonjour,

je suis en train de chercher un motif me permettant de transposer un
caract=C3=A8re accentu=C3=A9 en [le m=C3=AAme caract=C3=A8re non accentu=C3=
=A9] et j'aimerais
bien =C3=A9viter de me peler la liste =C3=A0 la main...

j'essaie des trucs genre :
perl -e '$a=3D"cr=C3=A9er";$a=3D~s/(\PM\pM+)//g;print $a' -> "cr=C3=A9er"

alors que (normal) :
perl -e '$a=3D"cr=C3=A9er";$a=3D~s/(\PM\pM*)//g;print $a' -> ""

pourtant, d'apr=C3=A8s ce que je comprends de la doc, (\PM\pM+) devrait
'matcher' [tout sauf un accent] suivi de [au moins un accent], non ?

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

merci pour toute piste,

--=20
Thomas vO

8 réponses

Avatar
Nicolas George
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).
Avatar
Thomas vO
merci pour les indications,

À (at) 24 Nov 2008 14:23:38 GMT,
Nicolas George <nicolas$ nous disait (told us):
$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
Avatar
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.
Avatar
espie
In article <492ac2f2$0$11569$,
Nicolas George <nicolas$ wrote:
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
Avatar
Nicolas George
Marc Espie wrote in message <ggeg26$2sa9$:
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.
Avatar
Paul Gaborit
À (at) 24 Nov 2008 15:06:26 GMT,
Nicolas George <nicolas$ écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Avatar
M
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.
Avatar
mpg
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.