A voir également:
- Substitution de motif avec Perl
- Denon perl pro test - Accueil - Audio
- Motif bordure de page word - Guide
- Motif hachure photoshop - Forum Graphisme
- Convocation police sans motif - forum ✓ - Forum Réseaux sociaux
- Spécificateur de substitution inconnu - Forum C++
6 réponses
Salut,
Je vois que tu veux carrément exclure les nom, prénom avec accents
Je vois que tu veux carrément exclure les nom, prénom avec accents
lami20j@debian:~$ cat texte.txt Personnage Dupont Emile Personnage2 Duval Daniel lami20j@debian:~$ cat nom.pl #!/usr/bin/perl use strict;use warnings; open TX,"texte.txt" or die "E/S : texte.txt $!\n"; open RES,">resultat.txt" or die "E/S : resultat.txt $!\n"; my $np=qr/^.+? # n'importe quels caractères # mais n'oubliont pas la gurmandise de + ([A-Z]{1}[a-z]+) # nom \s+ # séparateur ([A-Z]{1}[a-z]+) # prénom /x; # le modificateur x permet d'inserer # des espaces dans regex sans être pris pour motif # en ce cas pour espace il faut utiliser \s # ça permet de mettre des comméntaires dans regex print "$np\n\n"; # juste pour voir ce que contient # l'objet regex while (<TX>) { if(/$np/) { # ici il ne faut plus mettre des paranthèses # qr s'en occupe. my $ligne="<Nom>" . $1 . "</Prenom>"; print RES $ligne,"\n"; } } __END__ lami20j@debian:~$ perl nom.pl (?x-ism:^.+? # n'importe quels caractères # mais n'oubliont pas la gurmandise de + ([A-Z]{1}[a-z]+) # nom \s+ # séparateur ([A-Z]{1}[a-z]+) # prénom ) lami20j@debian:~$ cat resultat.txt <Nom>Dupont</Prenom> <Nom>Duval</Prenom> lami20j@debian:~$
Salut,
Ce n'est pas ce que je cherche exactement.
Pourtant c'est bien ça que tu as demandé.
Par exemple si le motif est composé de nom et prenom ("Dupont Emile"). On aura dans le fichier de retour <Nom> Dupont </Prenom>.
Si vous avez une idée là dessus merci de me venir en aide.
Ce n'est pas les idées qui manquent. Un grand pas en avant c'est bien comprendre ce qu'on veut obtenir ;-)
Ce n'est pas ce que je cherche exactement.
Pourtant c'est bien ça que tu as demandé.
Par exemple si le motif est composé de nom et prenom ("Dupont Emile"). On aura dans le fichier de retour <Nom> Dupont </Prenom>.
Si vous avez une idée là dessus merci de me venir en aide.
Ce n'est pas les idées qui manquent. Un grand pas en avant c'est bien comprendre ce qu'on veut obtenir ;-)
lami20j@debian:~$ cat nom.pl #!/usr/bin/perl use strict;use warnings; open TX,"texte.txt" or die "E/S : texte.txt $!\n"; open RES,">resultat.txt" or die "E/S : resultat.txt $!\n"; my $np=qr/^(.+?) # n'importe quels caractères # mais n'oubliont pas la gurmandise de + ([A-Z]{1}[a-z]+) # nom \s+ # séparateur ([A-Z]{1}[a-z]+) # prénom (.*)$ /x; # le modificateur x permet d'inserer # des espaces dans regex sans être pris pour motif # en ce cas pour espace il faut utiliser \s # ça permet de mettre des comméntaires dans regex print "$np\n\n"; # juste pour voir ce que contient # l'objet regex while (<TX>) { s/$np/$1<Nom>$2 $3<\/Prenom>$4/; print RES ; } __END__ lami20j@debian:~$ perl nom.pl (?x-ism:^(.+?) # n'importe quels caractères # mais n'oubliont pas la gurmandise de + ([A-Z]{1}[a-z]+) # nom \s+ # séparateur ([A-Z]{1}[a-z]+) # prénom (.*)$ ) lami20j@debian:~$ cat resultat.txt -Bonjour M. <Nom>Lemarchand Etienne</Prenom> -Avez vous rencontré votre superieur <Nom>Lefevre Jean</Prenom>.
Bonjour,
Merci. Je me suis mal faire comprendre peut être un peu plus haut. J'ai esayé et ça marche sauf qu'il me pose probléme quand je cherche comme motif des mots dont tous les lettres sont en majuscule.
Le motif est le suivant:
#!/usr/bin/perl
use strict;use warnings;
open TX,"texte.txt" or die "E/S : texte.txt $!\n";
open RES,">resultat.txt" or die "E/S : resultat.txt $!\n";
my $np=qr/^(.+?) # n'importe quels caractères
# mais n'oubliont pas la gurmandise de +
([A-Z]{1}[a-z]+) # nom
\s+ # séparateur
([A-Z]{1}[a-z]+) # prénom
(.*)$
/x; # le modificateur x permet d'inserer
# des espaces dans regex sans être pris pour motif
# en ce cas pour espace il faut utiliser \s
# ça permet de mettre des comméntaires dans regex
my $org=[A-Z]{2,}+;
print "$np\n\n"; # juste pour voir ce que contient
# l'objet regex
while (<TX>)
{
s/$np/$1<Nom>$2 $3<\/Prenom>$4/;
s/$org/<Organisation>$1<\/Organisation>/; #motif (mot en majuscule) encadré par ses balises.
print RES ;
}
Mais la troisiéme ligne de la boucle while ne marche à mon avis:
apparemment le compilateur n'aime pas le "]{" de my $org=[A-Z]{2,}+;
Merci.
Merci. Je me suis mal faire comprendre peut être un peu plus haut. J'ai esayé et ça marche sauf qu'il me pose probléme quand je cherche comme motif des mots dont tous les lettres sont en majuscule.
Le motif est le suivant:
#!/usr/bin/perl
use strict;use warnings;
open TX,"texte.txt" or die "E/S : texte.txt $!\n";
open RES,">resultat.txt" or die "E/S : resultat.txt $!\n";
my $np=qr/^(.+?) # n'importe quels caractères
# mais n'oubliont pas la gurmandise de +
([A-Z]{1}[a-z]+) # nom
\s+ # séparateur
([A-Z]{1}[a-z]+) # prénom
(.*)$
/x; # le modificateur x permet d'inserer
# des espaces dans regex sans être pris pour motif
# en ce cas pour espace il faut utiliser \s
# ça permet de mettre des comméntaires dans regex
my $org=[A-Z]{2,}+;
print "$np\n\n"; # juste pour voir ce que contient
# l'objet regex
while (<TX>)
{
s/$np/$1<Nom>$2 $3<\/Prenom>$4/;
s/$org/<Organisation>$1<\/Organisation>/; #motif (mot en majuscule) encadré par ses balises.
print RES ;
}
Mais la troisiéme ligne de la boucle while ne marche à mon avis:
apparemment le compilateur n'aime pas le "]{" de my $org=[A-Z]{2,}+;
Merci.
Re,
sauf qu'il me pose probléme quand je cherche comme motif des mots dont tous les lettres sont en majuscule.
Comment on peut savoir dans une phrase qu'il s'agit des nom prénoms parmi tous les mots?
On peut avoir comme ça
dupont emile
ou
Dupont emile
ou
DUPONT Emile
ou
DUPONT EMILE
ou
Dupont,Emile
etc.
Autrement dit, ce que tu demande c'est impossible avec une expression régulière ou autre fonction de recherche de chaîne s'il n'y a pas des règles précises de recherche de motif.
La seule solution (et ce n'est pas à 100%) c'est d'avoir un fichier qui contient tous les nom et prénoms) et ensuite faire des recherches et comparaisons.
sauf qu'il me pose probléme quand je cherche comme motif des mots dont tous les lettres sont en majuscule.
Comment on peut savoir dans une phrase qu'il s'agit des nom prénoms parmi tous les mots?
On peut avoir comme ça
dupont emile
ou
Dupont emile
ou
DUPONT Emile
ou
DUPONT EMILE
ou
Dupont,Emile
etc.
Autrement dit, ce que tu demande c'est impossible avec une expression régulière ou autre fonction de recherche de chaîne s'il n'y a pas des règles précises de recherche de motif.
La seule solution (et ce n'est pas à 100%) c'est d'avoir un fichier qui contient tous les nom et prénoms) et ensuite faire des recherches et comparaisons.
Re,
Comme je te l'ai dit Nom Prénom en fin de compte ça fait deux mots.
Chercher deux mots dans une phrase sans savoir quoi chercher, sans avoir une règle de recherche ce n'est pas possible. Tous les couples de deux mots sont valables.
Ensuite tu ne cherches plus des mots mais des abréviations en majuscules.
Mais qui nous dit qu'un mot qui est un majuscules et forcément une abréviation?
Se lancer dans un territoire inconnu pour faire des regex ce commet travailler à l'aveugle.
Une regex pour un mot un majuscules sera /\b[A-Z]+\b/ mais il va trouver tous les mots en majuscules, qu'ils soient des abréviations, noms, prénoms ou n'importe quelle signification.
Alors peut être c'est le moment de dire exactement ce qui t'a été demandé ainsi que de donner le fichier à traiter pour pouvoir tester.
Comme je te l'ai dit Nom Prénom en fin de compte ça fait deux mots.
Chercher deux mots dans une phrase sans savoir quoi chercher, sans avoir une règle de recherche ce n'est pas possible. Tous les couples de deux mots sont valables.
Ensuite tu ne cherches plus des mots mais des abréviations en majuscules.
Mais qui nous dit qu'un mot qui est un majuscules et forcément une abréviation?
Se lancer dans un territoire inconnu pour faire des regex ce commet travailler à l'aveugle.
Une regex pour un mot un majuscules sera /\b[A-Z]+\b/ mais il va trouver tous les mots en majuscules, qu'ils soient des abréviations, noms, prénoms ou n'importe quelle signification.
Alors peut être c'est le moment de dire exactement ce qui t'a été demandé ainsi que de donner le fichier à traiter pour pouvoir tester.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
Par exemple, mais ça ne marche pas si au lieu de ONU tu as O.N.U.
Par exemple, mais ça ne marche pas si au lieu de ONU tu as O.N.U.
lami20j@debian:~$ cat nom.pl #!/usr/bin/perl use strict;use warnings; open TX,"texte.txt" or die "E/S : texte.txt $!\n"; open RES,">resultat.txt" or die "E/S : resultat.txt $!\n"; my $np=qr/^(.+?) ([A-Z]{1}[a-z]+) \s+ ([A-Z]{1}[a-z]+) (.*)$ /x; my $abrev = qr/\b([A-Z]{2,})\b/; while (<TX>) { s/$np/$1<Nom>$2 $3<\/Prenom>$4/; s/$abrev/<abrev>$1<\/abrev>/g; print RES ; } __END__ lami20j@debian:~$ perl nom.pl lami20j@debian:~$ cat resultat.txt -Bonjour M. <Nom>Lemarchand Etienne</Prenom> -Avez vous rencontré votre superieur <Nom>Lefevre Jean</Prenom>. Au fait les mots en majuscule que je cherche n'ont rien à voir avec les noms et prénoms. C'est plutot les abreviations et cycle comme <abrev>ONU</abrev>(Organisation des nations unis) ou <abrev>INSA</abrev>, <abrev>POLYTECH</abrev>, <abrev>SNCF</abrev>.
Salut,
J'ai essayé pour les noms en majuscule et ça marche. C'est gentil. En fait je dois gérer egalement les dates. Pour les dates de type jj/mm/année. ou année/mm/jj je les ai tester et ça marche aussi.Mais pour les jours j'ai créer l'expression reguliére suivante:
my $date1="lundi"|"mardi"|"mercredi"|"jeudi"|"vendredi"|"samedi"|"dimanche";
et puis j'ai fait:
s/$date1/<TIMEX>$1<\/date1>/g;
Mais ça ne marche. J'ai du certainement mal ecrit mon expession.
Merci!!!
J'ai essayé pour les noms en majuscule et ça marche. C'est gentil. En fait je dois gérer egalement les dates. Pour les dates de type jj/mm/année. ou année/mm/jj je les ai tester et ça marche aussi.Mais pour les jours j'ai créer l'expression reguliére suivante:
my $date1="lundi"|"mardi"|"mercredi"|"jeudi"|"vendredi"|"samedi"|"dimanche";
et puis j'ai fait:
s/$date1/<TIMEX>$1<\/date1>/g;
Mais ça ne marche. J'ai du certainement mal ecrit mon expession.
Merci!!!
Salut,
Mais ça ne marche. J'ai du certainement mal ecrit mon expession.
Oui, certainement.
Colle ici ton texte pour pouvoir tester.
Je suppose que tu veux obtenir <TIMEX>lundi</TIMEX> par exemple.
Mais ça ne marche. J'ai du certainement mal ecrit mon expession.
Oui, certainement.
Colle ici ton texte pour pouvoir tester.
Je suppose que tu veux obtenir <TIMEX>lundi</TIMEX> par exemple.
Voici mon texte.
Par contre j'ai un peu evoluer en cherchant des nombres accompagner du signe pourcentage "%". et ça me pose un petit problème aussi. Si tu veux bien voir en meme temps de quoi il s'agit.
Merci
use strict;use warnings;
open TX,"texte.txt" or die "E/S : texte.txt $!\n";
open RES,">resultat.txt" or die "E/S : resultat.txt $!\n";
my $np=qr/^(.+?) # n'importe quels caractères
# mais n'oubliont pas la gurmandise de +
([A-Z]{1}[a-z]+) # nom
\s+ # séparateur
([A-Z]{1}[a-z]+) # prénom
(.*)$
/x; # le modificateur x permet d'inserer
# des espaces dans regex sans être pris pour motif
# en ce cas pour espace il faut utiliser \s
# ça permet de mettre des comméntaires dans regex
#my $organisation=[A-Z]{2,}+;
my $abrev = qr/\b([A-Z]{2,})\b/;
my $date= qr/\b([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,4})\b/;
#my $date1="lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche";
my $heure=qr/\b([0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,4})\b/; #Expression pour les heures.
my $valNumPourcentage=qr/\b([0-9]+\%)\b/; Expression nombre accompgné du signe pourcentage.
print "$np\n\n"; # juste pour voir ce que contient
# l'objet regex
while (<TX>)
{
s/$np/$1<Nom>$2 $3<\/Prenom>$4/;
s/$abrev/<abrev>$1<\/abrev>/g;
s/$date/<date>$1<\/date>/g;
s/$heure/<heure>$1<\/heure>/g;
s/$valNumPourcentage/<Valeur Numerique Pourcentage>$1<\/Valeur Numerique Pourcentage>/g; # Tester les valeurs numériques avec pourcentage.
#s/$date1/<TIMEX>$1<\/date1>/g;
print RES ;
}
Merci.
Par contre j'ai un peu evoluer en cherchant des nombres accompagner du signe pourcentage "%". et ça me pose un petit problème aussi. Si tu veux bien voir en meme temps de quoi il s'agit.
Merci
use strict;use warnings;
open TX,"texte.txt" or die "E/S : texte.txt $!\n";
open RES,">resultat.txt" or die "E/S : resultat.txt $!\n";
my $np=qr/^(.+?) # n'importe quels caractères
# mais n'oubliont pas la gurmandise de +
([A-Z]{1}[a-z]+) # nom
\s+ # séparateur
([A-Z]{1}[a-z]+) # prénom
(.*)$
/x; # le modificateur x permet d'inserer
# des espaces dans regex sans être pris pour motif
# en ce cas pour espace il faut utiliser \s
# ça permet de mettre des comméntaires dans regex
#my $organisation=[A-Z]{2,}+;
my $abrev = qr/\b([A-Z]{2,})\b/;
my $date= qr/\b([0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,4})\b/;
#my $date1="lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche";
my $heure=qr/\b([0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,4})\b/; #Expression pour les heures.
my $valNumPourcentage=qr/\b([0-9]+\%)\b/; Expression nombre accompgné du signe pourcentage.
print "$np\n\n"; # juste pour voir ce que contient
# l'objet regex
while (<TX>)
{
s/$np/$1<Nom>$2 $3<\/Prenom>$4/;
s/$abrev/<abrev>$1<\/abrev>/g;
s/$date/<date>$1<\/date>/g;
s/$heure/<heure>$1<\/heure>/g;
s/$valNumPourcentage/<Valeur Numerique Pourcentage>$1<\/Valeur Numerique Pourcentage>/g; # Tester les valeurs numériques avec pourcentage.
#s/$date1/<TIMEX>$1<\/date1>/g;
print RES ;
}
Merci.
24 déc. 2009 à 17:43
Merci pour l'exemple de code. Par contre il y a un petit souci. Ce n'est pas ce que je cherche exactement. Pour être plus claire, je voudrais mettre mettre le contenu de mon texte de lecture dans mon texte d'ecriture en changeant juste le motif rencontré.
Par exemple si j'ai dans mon texte deux lignes qui sont les suivantes:
-Bonjour M. Lemarchand Etienne comment vous allez.
-Avez vous rencontré votre superieur Lefevre Jean.
J'aurais dans mon fichier d'ecriture les deux lignes suivantes:
-Bonjour M. <Nom>Lemarchand Etienne</Prenom> comment vous allez.
-Avez vous rencontré votre superieur <Nom>Lefevre Jean</Prenom>.
Si vous avez une idée là dessus merci de me venir en aide.