Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > fr.comp.lang.regexp > #182 > unrolled thread
| Started by | kurtz le pirate <kurtzlepirate@free.fr> |
|---|---|
| First post | 2022-10-23 10:56 +0200 |
| Last post | 2022-10-23 13:25 +0000 |
| Articles | 14 — 4 participants |
Back to article view | Back to fr.comp.lang.regexp
Extraction nombre décimaux. kurtz le pirate <kurtzlepirate@free.fr> - 2022-10-23 10:56 +0200
Re: Extraction nombre décimaux. Olivier Miakinen <om+news@miakinen.net> - 2022-10-23 11:32 +0200
Re: Extraction nombre décimaux. Marc SCHAEFER <schaefer@alphanet.ch> - 2022-10-23 13:17 +0000
Re: Extraction nombre décimaux. Richard Hachel <r.hachel@jesaispu.fr> - 2022-10-23 13:18 +0000
Re: Extraction nombre décimaux. Olivier Miakinen <om+news@miakinen.net> - 2022-10-23 20:35 +0200
Re: Extraction nombre décimaux. Olivier Miakinen <om+news@miakinen.net> - 2022-10-23 20:33 +0200
Re: Extraction nombre décimaux. Marc SCHAEFER <schaefer@alphanet.ch> - 2022-10-24 06:52 +0000
Re: Extraction nombre décimaux. Marc SCHAEFER <schaefer@alphanet.ch> - 2022-10-24 06:53 +0000
Re: Extraction nombre décimaux. Marc SCHAEFER <schaefer@alphanet.ch> - 2022-10-23 13:15 +0000
Re: Extraction nombre décimaux. kurtz le pirate <kurtzlepirate@free.fr> - 2022-10-24 17:27 +0200
Re: Extraction nombre décimaux. Olivier Miakinen <om+news@miakinen.net> - 2022-10-24 17:57 +0200
Re: Extraction nombre décimaux. kurtz le pirate <kurtzlepirate@free.fr> - 2022-10-25 16:58 +0200
Re: Extraction nombre décimaux. Olivier Miakinen <om+news@miakinen.net> - 2022-10-26 15:58 +0200
Re: Extraction nombre décimaux. Marc SCHAEFER <schaefer@alphanet.ch> - 2022-10-23 13:25 +0000
| From | kurtz le pirate <kurtzlepirate@free.fr> |
|---|---|
| Date | 2022-10-23 10:56 +0200 |
| Subject | Extraction nombre décimaux. |
| Message-ID | <635501d4$0$22259$426a74cc@news.free.fr> |
Bonjour,
Je troune en rond depuis quelques temps sur l'extraction de nombre
décimaux depuis un fichiers. je n'arrive pas à capturer le signe.
Le bout de code :
my $countLine = 1;
my @floatnum;
foreach my $line (<SRCFILE>) {
chomp $line;
printf("%4d : %s\n", $countLine, $line);
@floatnum = $line =~ /[-+]?([0-9]*\.[0-9]+|[0-9]+)/g;
# @floatnum = $line =~ /($RE{num}{real})/g;
# @floatnum = $line =~ /([+-]?\d+(\.\d+)?)/g;
if (@floatnum) {
print "float = $_\n" foreach (@floatnum);
}
$countLine++;
}
Surtout (!) pour les nombres négatifs.
Le "+" pour les nombres positifs n'existe jamais.
Exemple :
#declare x = -.168452; #declare y = 0.456; #declare z = -5.4563e6;
Je récupère :
float = .168452
float = 0.456
float = 5.4563
float = 6
Pas de signe.
Faut aussi que je m'occupe des exposants mais après ...
Merci pour vos suggestions.
--
kurtz le pirate
compagnie de la banquise
[toc] | [next] | [standalone]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2022-10-23 11:32 +0200 |
| Message-ID | <tj31nm$1nql$1@cabale.usenet-fr.net> |
| In reply to | #182 |
Bonjour,
Le 23/10/2022 10:56, kurtz le pirate a écrit :
>
> Je troune en rond depuis quelques temps sur l'extraction de nombre
> décimaux depuis un fichiers. je n'arrive pas à capturer le signe.
Je suggère :
/(?=[-+]?[0-9.])([-+]?)([0-9]*)(?:\.([0-9]+))?(?:e([0-9]+))?/g
L'assertion (?=[-+]?[0-9.]) au début permet de ne considérer que ce qui
ressemble déjà à un nombre (sinon ça matchera aussi la chaîne vide).
> @floatnum = $line =~ /[-+]?([0-9]*\.[0-9]+|[0-9]+)/g;
> # @floatnum = $line =~ /($RE{num}{real})/g;
> # @floatnum = $line =~ /([+-]?\d+(\.\d+)?)/g;
Tu ne peux capturer qu'une seule chose à la fois ???
> Exemple :
> #declare x = -.168452; #declare y = 0.456; #declare z = -5.4563e6;
>
> Je récupère :
> float = .168452
> float = 0.456
> float = 5.4563
> float = 6
Je récupère :
-.168452
"-"
""
"168452"
""
0.456
""
"0"
"456"
""
-5.4563e6
"-"
"5"
"4563"
"6"
--
Olivier Miakinen
[toc] | [prev] | [next] | [standalone]
| From | Marc SCHAEFER <schaefer@alphanet.ch> |
|---|---|
| Date | 2022-10-23 13:17 +0000 |
| Message-ID | <tj3esp$90q$2@shakotay.alphanet.ch> |
| In reply to | #183 |
Olivier Miakinen <om+news@miakinen.net> wrote: > /(?=[-+]?[0-9.])([-+]?)([0-9]*)(?:\.([0-9]+))?(?:e([0-9]+))?/g Je me demande si p.ex. avec la ligne "4.5 -1.2" ça risque de créer un tableau (4.5, -, 1.2).
[toc] | [prev] | [next] | [standalone]
| From | Richard Hachel <r.hachel@jesaispu.fr> |
|---|---|
| Date | 2022-10-23 13:18 +0000 |
| Message-ID | <-hU3YqnraOLtci_go3M9rafvOeo@jntp> |
| In reply to | #185 |
Le 23/10/2022 à 15:17, Marc SCHAEFER a écrit : > Olivier Miakinen <om+news@miakinen.net> wrote: >> /(?=[-+]?[0-9.])([-+]?)([0-9]*)(?:\.([0-9]+))?(?:e([0-9]+))?/g > > Je me demande si p.ex. avec la ligne "4.5 -1.2" ça risque > de créer un tableau (4.5, -, 1.2). C'est tout ce que tu te demandes, toi le génie suisse? ? ? R.H.
[toc] | [prev] | [next] | [standalone]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2022-10-23 20:35 +0200 |
| Message-ID | <tj41h1$1u68$2@cabale.usenet-fr.net> |
| In reply to | #186 |
Le 23/10/2022 15:18, Richard Hachel a écrit : > > C'est tout ce que tu te demandes, toi le génie suisse? ? ? Qu'en penses-tu, toi le prétendu multi-nobélisé ? Au fait quels prix Nobel prétends-tu avoir eu, et en quelles années ? -- Olivier Miakinen
[toc] | [prev] | [next] | [standalone]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2022-10-23 20:33 +0200 |
| Message-ID | <tj41dt$1u68$1@cabale.usenet-fr.net> |
| In reply to | #185 |
Le 23/10/2022 15:17, Marc SCHAEFER a écrit :
> Olivier Miakinen <om+news@miakinen.net> wrote:
>> /(?=[-+]?[0-9.])([-+]?)([0-9]*)(?:\.([0-9]+))?(?:e([0-9]+))?/g
>
> Je me demande si p.ex. avec la ligne "4.5 -1.2" ça risque
> de créer un tableau (4.5, -, 1.2).
Je ne sais pas trop comment ça fonctionne en perl, mais en pricipe
ça devrait plutôt créer un tableau du style :
( ("4.5", "", "4", "5", ""), ("-1.2", "-", "1", "2", "") )
Du moins si l'item 0 pour chaque capture est la séquence complète qui
a été capturée par la regexp, et si les items 1, 2, 3 et 4 correspondent
à chaque paire de parenthèses capturantes.
--
Olivier Miakinen
[toc] | [prev] | [next] | [standalone]
| From | Marc SCHAEFER <schaefer@alphanet.ch> |
|---|---|
| Date | 2022-10-24 06:52 +0000 |
| Message-ID | <tj5co3$qg5$1@shakotay.alphanet.ch> |
| In reply to | #188 |
Olivier Miakinen <om+news@miakinen.net> wrote:
> Je ne sais pas trop comment ça fonctionne en perl, mais en pricipe
> ça devrait plutôt créer un tableau du style :
> ( ("4.5", "", "4", "5", ""), ("-1.2", "-", "1", "2", "") )
En Perl, on a ce qu'on appelle le contexte de liste, ce qui met à plat
les tableaux. Ce qui permet en une opération de mettre toutes les
occurences (/g) de parenthèses dans le même tableau.
exemple:
$ ./a.pl
bad: schaefer, alphanet.ch, toto, truc.org
avec a.pl:
schaefer@reliand:/tmp$ ./a.pl
bad: schaefer, alphanet.ch, toto, truc.org
good: schaefer@alphanet.ch, toto@truc.org
avec:
use strict;
use warnings;
my $s = 'schaefer@alphanet.ch toto@truc.org';
my @bad = $s =~ /([^\@\s]+)\@([^\s]+)/g;
print "bad: ", join(', ', @bad), "\n";
my @good = $s =~ /([^\s]+)/g;
#my @good = split /\s+/, $s;
print "good: ", join(', ', @good), "\n";
> Du moins si l'item 0 pour chaque capture est la séquence complète qui
> a été capturée par la regexp, et si les items 1, 2, 3 et 4 correspondent
> à chaque paire de parenthèses capturantes.
En Perl, ça correspond à $1, $2, $3, ... pour chacune des parenthèses.
C'est tout. On peut bien sûr imbriquer une toute grande parenthèse qui
sera alors $1. $0 en Perl est toujours le nom du programme tel qu'il a
été appelé (équivalent en C de argv[0])
Si l'on n'aime pas ça, on peut aussi utiliser la variante suivante:
my @tableau;
# modifie $s
$s =~ s/([^\@\s]+)\@([^\s]+)/process_it($1, $2)/ge;
avec
sub process_it {
my ($user, $domain) = @_;
push(@tableau, [ $user, $domain ]);
}
Dans ce cas on aura @tableau = ([ 'schaefer', 'alphanet.ch' ], [ 'toto',
'truc.org' ]) que l'on peut reconvertir en ('schaefer@alphanet.ch',
'toto@truc.org') avec:
# usage de la variable par défaut $_, ici en tant que
# référence sur un tableau
@tableau = map { $_->[0] . '@' . $_->[1] } @tableau;
ou encore remplacer process_it par un simple:
sub process_it {
my ($user, $domain) = @_;
push(@tableau, $user . '@' . $domain);
}
PS: en Perl () c'est une liste/tableau; [] une référence sur une
liste/tableau, symétriquement pour les hashes () et {}.
[toc] | [prev] | [next] | [standalone]
| From | Marc SCHAEFER <schaefer@alphanet.ch> |
|---|---|
| Date | 2022-10-24 06:53 +0000 |
| Message-ID | <tj5cp7$qg5$2@shakotay.alphanet.ch> |
| In reply to | #188 |
Olivier Miakinen <om+news@miakinen.net> wrote:
> Je ne sais pas trop comment ça fonctionne en perl, mais en pricipe
> ça devrait plutôt créer un tableau du style :
> ( ("4.5", "", "4", "5", ""), ("-1.2", "-", "1", "2", "") )
En Perl, on a ce qu'on appelle le contexte de liste, ce qui met à plat
les tableaux. Ce qui permet en une opération de mettre toutes les
occurences (/g) de parenthèses dans le même tableau.
exemple:
$ ./a.pl
bad: schaefer, alphanet.ch, toto, truc.org
good: schaefer@alphanet.ch, toto@truc.org
avec a.pl:
use strict;
use warnings;
my $s = 'schaefer@alphanet.ch toto@truc.org';
my @bad = $s =~ /([^\@\s]+)\@([^\s]+)/g;
print "bad: ", join(', ', @bad), "\n";
my @good = $s =~ /([^\s]+)/g;
#my @good = split /\s+/, $s;
print "good: ", join(', ', @good), "\n";
> Du moins si l'item 0 pour chaque capture est la séquence complète qui
> a été capturée par la regexp, et si les items 1, 2, 3 et 4 correspondent
> à chaque paire de parenthèses capturantes.
En Perl, ça correspond à $1, $2, $3, ... pour chacune des parenthèses.
C'est tout. On peut bien sûr imbriquer une toute grande parenthèse qui
sera alors $1. $0 en Perl est toujours le nom du programme tel qu'il a
été appelé (équivalent en C de argv[0])
Si l'on n'aime pas ça, on peut aussi utiliser la variante suivante:
my @tableau;
# modifie $s
$s =~ s/([^\@\s]+)\@([^\s]+)/process_it($1, $2)/ge;
avec
sub process_it {
my ($user, $domain) = @_;
push(@tableau, [ $user, $domain ]);
}
Dans ce cas on aura @tableau = ([ 'schaefer', 'alphanet.ch' ], [ 'toto',
'truc.org' ]) que l'on peut reconvertir en ('schaefer@alphanet.ch',
'toto@truc.org') avec:
# usage de la variable par défaut $_, ici en tant que
# référence sur un tableau
@tableau = map { $_->[0] . '@' . $_->[1] } @tableau;
ou encore remplacer process_it par un simple:
sub process_it {
my ($user, $domain) = @_;
push(@tableau, $user . '@' . $domain);
}
PS: en Perl () c'est une liste/tableau; [] une référence sur une
liste/tableau, symétriquement pour les hashes () et {}.
[toc] | [prev] | [next] | [standalone]
| From | Marc SCHAEFER <schaefer@alphanet.ch> |
|---|---|
| Date | 2022-10-23 13:15 +0000 |
| Message-ID | <tj3eq4$90q$1@shakotay.alphanet.ch> |
| In reply to | #182 |
kurtz le pirate <kurtzlepirate@free.fr> wrote:
> @floatnum = $line =~ /[-+]?([0-9]*\.[0-9]+|[0-9]+)/g;
comme [-+]? n'est pas entre (), Perl ne va pas l'extraire et il ne va
pas finir dans le tableau.
@floatnum = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g;
démo:
schaefer@reliand:/tmp$ ./a.pl
1.2
1.2
1.2 4.5
1.2, 4.5
-1.2
-1.2
-1.2 4.5
-1.2, 4.5
schaefer@reliand:/tmp$ cat a.pl
#! /usr/bin/perl
use strict;
use warnings;
my $re = '^[-+]';
while (my $line = <STDIN>) {
my @f = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g;
print join(', ', @f), "\n";
}
[toc] | [prev] | [next] | [standalone]
| From | kurtz le pirate <kurtzlepirate@free.fr> |
|---|---|
| Date | 2022-10-24 17:27 +0200 |
| Message-ID | <6356aeee$0$25442$426a74cc@news.free.fr> |
| In reply to | #184 |
On 23/10/2022 15:15, Marc SCHAEFER wrote: > ... > @floatnum = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g; > ... oui, ça marche bien :) Merci ! par contre, comme ça marche bien, je suis tombé sur une autre problème avec cette ligne par exemple : CIE_ColorSystemWhitepoint(ColSys,Blackbody2Whitepoint(4000)) ça capture le "2" dans Blackbody2Whitepoint et de manière générale, les nombres dans le nom des variables... je sens que ça va être sport. encore merci Marc. -- kurtz le pirate compagnie de la banquise
[toc] | [prev] | [next] | [standalone]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2022-10-24 17:57 +0200 |
| Message-ID | <tj6cm1$2lmb$1@cabale.usenet-fr.net> |
| In reply to | #192 |
Le 24/10/2022 17:27, kurtz le pirate a écrit : >> ... >> @floatnum = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g; > > par contre, comme ça marche bien, je suis tombé sur une autre > problème avec cette ligne par exemple : > > CIE_ColorSystemWhitepoint(ColSys,Blackbody2Whitepoint(4000)) > > ça capture le "2" dans Blackbody2Whitepoint et de manière générale, les > nombres dans le nom des variables... je sens que ça va être sport. @floatnum = $line =~ /(?<!\w)([-+]?[0-9]*\.[0-9]+|[0-9]+)(?!\w)/g; -- Olivier Miakinen
[toc] | [prev] | [next] | [standalone]
| From | kurtz le pirate <kurtzlepirate@free.fr> |
|---|---|
| Date | 2022-10-25 16:58 +0200 |
| Message-ID | <6357f999$0$24819$426a34cc@news.free.fr> |
| In reply to | #193 |
On 24/10/2022 17:57, Olivier Miakinen wrote: > ...> > @floatnum = $line =~ /(?<!\w)([-+]?[0-9]*\.[0-9]+|[0-9]+)(?!\w)/g; > Plus rapide que l'éclair ! Je n'avais même pas commencé à chercher. Merci Olivier. -- kurtz le pirate compagnie de la banquise
[toc] | [prev] | [next] | [standalone]
| From | Olivier Miakinen <om+news@miakinen.net> |
|---|---|
| Date | 2022-10-26 15:58 +0200 |
| Message-ID | <tjbeen$19qj$1@cabale.usenet-fr.net> |
| In reply to | #194 |
Le 25/10/2022 à 16:58, kurtz le pirate a écrit : > >> @floatnum = $line =~ /(?<!\w)([-+]?[0-9]*\.[0-9]+|[0-9]+)(?!\w)/g; > > Plus rapide que l'éclair ! > Je n'avais même pas commencé à chercher. :-) J'adoooore les assertions. Ça a été un immense progrès dans les regexp (Perl et PCRE). -- Olivier Miakinen
[toc] | [prev] | [next] | [standalone]
| From | Marc SCHAEFER <schaefer@alphanet.ch> |
|---|---|
| Date | 2022-10-23 13:25 +0000 |
| Message-ID | <tj3fco$b2h$1@shakotay.alphanet.ch> |
| In reply to | #182 |
kurtz le pirate <kurtzlepirate@free.fr> wrote:
> @floatnum = $line =~ /[-+]?([0-9]*\.[0-9]+|[0-9]+)/g;
comme [-+]? n'est pas entre (), Perl ne va pas l'extraire et il ne va
pas finir dans le tableau.
@floatnum = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g;
démo:
schaefer@reliand:/tmp$ ./a.pl
1.2
1.2
1.2 4.5
1.2, 4.5
-1.2
-1.2
-1.2 4.5
-1.2, 4.5
schaefer@reliand:/tmp$ cat a.pl
#! /usr/bin/perl
use strict;
use warnings;
while (my $line = <STDIN>) {
my @f = $line =~ /([-+]?[0-9]*\.[0-9]+|[0-9]+)/g;
print join(', ', @f), "\n";
}
[toc] | [prev] | [standalone]
Back to top | Article view | fr.comp.lang.regexp
csiph-web