Un utilisateur entre dans un ensemble de noms avec des accents et des tildes: ma base de données a des noms anglicisés pour ces personnes p> i Souhaitez faire une correspondance Regexp sur ces noms. P> $string = "Renato Núñez, David DeJesús, and Edwin Encarnación";
foreach my $name (@names) {
$name =~ s|a|[áa]|;
$name =~ s|e|[ée]|;
$name =~ s|i|[Ãi]|;
$name =~ s|o|[óo]|;
$name =~ s|u|[úu]|;
$name =~ s|n|[ñn]|;
# Originally: print "found:$name\n" if ($name =~ /$string/);
# Corrected to:
print "found:$name\n" if ($string =~ /$name/);
}
5 Réponses :
Il semble que vous échangez le paramètre.
Vous tapez qui tentent de remplacer le modèle "A" par "[áa]"
Essayez p> échanger la correspondance et ça fonctionnera. P> $string = "Renato Núñez, David DeJesús, and Edwin Encarnación";
foreach my $name (@names) {
print "found:$name\n" if ($string =~ /$name/);
}
Oui, j'avais $ string et $ nom inversé dans la dernière commande. Mais je ne pense pas que l'inverser S | [AA '] | A | Travaillera-t-il que cela convertira mes noms en caractères non espagnols et il ne correspondra pas à la chaîne?
Je pense que vous utilisez comme étant la ficelle «Renato Núñez, David Dejesús et Edwin Encarnación» P>
Si je comprends bien, vous essayez de faire correspondre chacun des noms dans la phrase "Renato Núñez, David Dejesús et Edwin Encarnación". p>
Si tel est le cas, vous devez écrire: $ string = ~ / $ nom / au lieu de $ NOM = ~ / $ String / CODE> P> P> P> P>
Oui merci. Je l'avais inversé. J'ai réparé la question maintenant.
Cela pourrait être plus conforme à ce que vous essayez de faire. OUT P> Trouvé: Renato Nunez ~ Renato NãºÃ ¡EZ Code >
Trouvé: David Dejesus ~ David Dejesús Code>
Trouvé: Edwin Encarnacion ~ Edwin Encarnación Code> P> P>
Je vais essayer ça. Cela ressemblait à ce que j'avais que cela n'a pas travaillé plus tôt. Cela se fait envoyer via une webform, alors peut-être que les caractères de la chaîne sont codés d'une manière ou d'une autre. Je vais devoir vérifier ça.
Googling pour cela, je vois que le problème est assez courant (j'ai utilisé la requête "Perl Supprimer DiCritic"). N'oubliez pas que ce n'est pas une science «exact» (élimination des diacritiques et un texte anglicisant). Ici, il y a quelques liens: p>
http://www.ahinea.com/fr/tech/accenter- Traduire.html P>
http://search.cpan.org /~wollmers/text-undiaCritic-0.02/lib/text/undiagritic.pm p>
http://search.cpan.org/~ldachary/ Text-Unaccent-1.08 / Unaccent.pm P>
comme une suggestion, pour une méthode rapide N-sale: P>
\ p {m} code> (il trouvera toutes les marques) li>
- Votre chaîne n'a pas de symboles avec diacritique et vous pouvez faire une comparaison "simple" li>
- Mais notez que de nombreuses "lettres étranges" ont survécu: ßøœ par exemple. C'était un N-Dirty N la fin! Li>
ul>
Je ne peux pas vous aider davantage parce que c'est de nombreuses années que je ne programme pas à Perl. P>
#!/usr/bin/env perl
#
# búsqueda-libre:
#
# Cómo se debiera ordenar y buscar palabras en Unicode
# que pueden llevarse marcas diacrÃticas (o no) sin que
# éstas afecten la búsqueda. También cómo cambiar el
# el orden para que no cuente con articulos al principio
# del los nombres, como se hace con los tÃtulos de libros &c.
#
# Tom Christiansen <tchrist@perl.com>
# Fri Mar 4 21:06:35 MST 2011
#
#############################################
use utf8;
use 5.10.1;
use strict;
use warnings; # FATAL => "all";
use autodie;
use charnames qw< :full >;
use List::Util qw< max first >;
use Unicode::Collate;
my $INCLUÃR_NINGUNOS = 0;
my $SI_IMPORTAN_MARCAS_DIACRÃTICAS = 0;
sub sÃ_ó_no(_) { $_[0] ? "sÃ" : "no" }
sub encomillar(_) {
return join $_[0] =>
"\N{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}",
"\N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}",
;
}
binmode(STDOUT, ":utf8");
# Ãsta está demasiada larga para la pantalla. :(
#
# La Ciudad de Nuestra Señora la Reina de Los Ãngeles de Porciúncula, California Alta
#
my @ciudades_españolas = ordenar_a_la_española(<<'LA_ÃLTIMA' =~ /\S.*\S/g);
Santa Eulà lia de Ronçana
Mañón
A Pobra do Caramiñal
La AlberguerÃa de Argañán
Logroño
La Puebla del RÃo
Villar de Argañán
PiñuécarâGandullas
Mantilla
Gallegos de Argañán
Madroñal
Griñón
Lliçà dâAmunt
Valverde de Alcalá
Montalbán de Córdoba
San MartÃn del Castañar
La Peña
Cabezón de Liébana
Doña MencÃa
Santa MarÃa de Cayón
Bóveda del RÃo Almar
La Roca del Vallès
Matilla de los Caños del RÃo
Prats de Lluçanès
Ribamontán al Monte
LA_ÃLTIMA
my $cmáx = -(2 + max map { length } @ciudades_españolas);
my @búsquedas = < {A,E,I,O,U}N AL >;
my $bmáx = -(2 + max map { length } @búsquedas);
my $ordenador = new Unicode::Collate::
level => $SI_IMPORTAN_MARCAS_DIACRÃTICAS ? 2 : 1,
## variable => "non-ignorable", # blanked, non-ignorable, shifted, shift-trimmed
normalization => undef,
;
for my $aldea (@ciudades_españolas) {
my $déjà _imprimée;
for my $búsqueda (@búsquedas) {
my @resultados = $ordenador->gmatch($aldea, $búsqueda);
next unless @resultados || $INCLUÃR_NINGUNOS;
printf qq(%*s %s tiene %*s en %17s %s\n),
$cmáx => !$déjà _imprimée++ && encomillar($aldea),
sÃ_ó_no(@resultados),
$bmáx => "/$búsqueda/",
cuántos_sitios(@resultados),
enfilar(@resultados);
}
}
sub cuántos_sitios {
my @lista = @_;
my $cantidad = @_;
given ($cantidad) {
when (0) { return "ningún sitio" }
when (1) { return "un solo sitio" }
when (2) { return "un par de sitios" }
default { return "$cantidad sitios" }
}
}
sub enfilar {
my @lista = map { encomillar } @_;
my $separador = "\N{COMMA}";
$separador = "\N{SEMICOLON}" if first { /$separador/ } @lista;
$separador .= "\N{SPACE}";
given (scalar @lista) {
when (0) { return "" }
when (1) { return "@lista" }
when (2) { return join " y " => @lista }
default { return
join($separador => @lista[ 0 .. ($#lista-1) ])
. " y $lista[$#lista]";
}
}
}
###################################################
# Para ordenar los elementos de la lista
# en el estilo tradicional del castellano.
#
# Tenemos en cuenta que sà pueden aparecerse nombres
# de ciudades que no son nombres sólo castellanos
# sino tambÃen catalanes y gallegos â y tal vez más,
# como en asturianu or aranés, pero no he pensado
# mucho es estos.
###################################################
sub ordenar_a_la_española {
my @lista = @_;
state $ordenador_a_la_española = new Unicode::Collate::
# Si se tuviese Unicode::Collate::Locale con "es__traditional",
# no harÃa falta este primer lÃo con su entrada especial,
# con la excepción de la c-cedilla, la cual aquà se ordena
# como si fuese catalán, no castellano.
# Vamos a meter las nuevas entradas después de éstas,
# que son copiadas del DUCET v6.0.0. Tuve que cambiar unos
# valores que tenÃa este código desde otra versión anterior.
#
# 0043 ; [.123D.0020.0008.0043] # LATIN CAPITAL LETTER C
# 00C7 ; [.123D.0020.0008.0043][.0000.0056.0002.0327] # LATIN CAPITAL LETTER C WITH CEDILLA; QQCM
# 004C ; [.1330.0020.0008.004C] # LATIN CAPITAL LETTER L
# 004E ; [.136D.0020.0008.004E] # LATIN CAPITAL LETTER N
# 00D1 ; [.136D.0020.0008.004E][.0000.004E.0002.0303] # LATIN CAPITAL LETTER N WITH TILDE; QQCM
entry => <<'SALIDA', # :)
00E7 ; [.123E.0020.0002.0327] # c-cedilla
0063 0327 ; [.123E.0020.0002.0327] # c-cedilla
00C7 ; [.123E.0020.0002.0327] # C-cedilla
0043 0327 ; [.123E.0020.0002.0327] # C-cedilla
0063 0068 ; [.123F.0020.0002.0043] # ch
0043 0068 ; [.123F.0020.0007.0043] # Ch
0043 0048 ; [.123F.0020.0008.0043] # CH
006C 006C ; [.1331.0020.0002.004C] # ll
004C 006C ; [.1331.0020.0007.004C] # Ll
004C 004C ; [.1331.0020.0008.004C] # LL
00F1 ; [.136E.0020.0002.0303] # n-tilde
006E 0303 ; [.136E.0020.0002.0303] # n-tilde
00D1 ; [.136E.0020.0008.0303] # N-tilde
004E 0303 ; [.136E.0020.0008.0303] # N-tilde
SALIDA
upper_before_lower => 1,
normalization => "NFKD", # ¿Y porqué no?
preprocess => sub {
my $_ = shift;
###
# no incluye los artÃculos definitivos ni indefinitivos
###
s/^L\p{QMARK}//; # puede encontrarse en el catalán
s{ ^
(?: # del castellano
El
| Los
| La
| Las
# del catalán
| Els
| Les
| Sa
| Es
# del gallego
| O
| Os
| A
| As
)
\h +
}{}x;
# Luego quita las palabras no-importantes interiores.
s/\b[dl]\p{QMARK}//g; # del catalán
s{
\b
(?:
el | los | la | las | de | del | y # ES
| els | les | i | sa | es | dels # CA
| o | os | a | as | do | da | dos | das # GAL
)
\b
}{}gx;
return $_;
}, # fin de rutina preprocesadora
## ¡Fijaos que no borréis esta marca!
## Este punto y coma marca el fin
## de los argumentos del constructor
## empezado ya muchas lineas arriba.
## Ë
; # âââ SÃ, ése â dejadlo en paz o muy tristes os quedaréis.
## Ë
return $ordenador_a_la_española->sort(@lista);
}
Merci pour cela. Je vais regarder cela plus attentivement.
Suggestion 1: opérateurs d'expression réguliers dans perldoc perlop . Je pense que vous voulez dire
$ string = ~ / $ nom / nom / code> au lieu de$ Name = ~ / $ string / code> S | [Áa] | a | code> au lieu des | a | [Áa] | code>.J'ai le S ||| Commander la façon dont je fais parce que je veux construire une regex de la chaîne "David Dejesus" qui correspondra au nom avec ou sans l'accent.
Oh maintenant je vois. Vous essayez de créer une expression régulière dans
Name Code>, de ne pas supprimer les caractères non anglicisés.Consultez le code que je viens d'ajouter à ma réponse pour vous montrer comment faire correspondre les chaînes qui pourraient avoir des accents en eux sans avoir à craindre de s'ils le font ou non.