Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.regexp > #182 > unrolled thread

Extraction nombre décimaux.

Started bykurtz le pirate <kurtzlepirate@free.fr>
First post2022-10-23 10:56 +0200
Last post2022-10-23 13:25 +0000
Articles 14 — 4 participants

Back to article view | Back to fr.comp.lang.regexp


Contents

  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

#182 — Extraction nombre décimaux.

Fromkurtz le pirate <kurtzlepirate@free.fr>
Date2022-10-23 10:56 +0200
SubjectExtraction 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]


#183

FromOlivier Miakinen <om+news@miakinen.net>
Date2022-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]


#185

FromMarc SCHAEFER <schaefer@alphanet.ch>
Date2022-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]


#186

FromRichard Hachel <r.hachel@jesaispu.fr>
Date2022-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]


#189

FromOlivier Miakinen <om+news@miakinen.net>
Date2022-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]


#188

FromOlivier Miakinen <om+news@miakinen.net>
Date2022-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]


#190

FromMarc SCHAEFER <schaefer@alphanet.ch>
Date2022-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]


#191

FromMarc SCHAEFER <schaefer@alphanet.ch>
Date2022-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]


#184

FromMarc SCHAEFER <schaefer@alphanet.ch>
Date2022-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]


#192

Fromkurtz le pirate <kurtzlepirate@free.fr>
Date2022-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]


#193

FromOlivier Miakinen <om+news@miakinen.net>
Date2022-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]


#194

Fromkurtz le pirate <kurtzlepirate@free.fr>
Date2022-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]


#195

FromOlivier Miakinen <om+news@miakinen.net>
Date2022-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]


#187

FromMarc SCHAEFER <schaefer@alphanet.ch>
Date2022-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