OVH Cloud OVH Cloud

Expressions régulières: distinguer un entier ?

8 réponses
Avatar
ctobini
Bonjour,

Je voudrais parser un fichier CSV avec certaines lignes comme :

Valeurs;10;12;15;26

Je suis en train de me casser la t=EAte pour avoir une expression
r=E9guli=E8re:

si la ligne contient un motif ";quelque_chose_qui_n_est_pas_un_entier;"

mais je crois qu'il n'y a pas moyen de distinguer un entier d'un
flottant en Perl.

Auriez-vous un conseil l=E0-dessus ?

En vous remerciant,

C=2E Tobini

8 réponses

Avatar
ctobini
Bon, je m'en suis sorti avec le module DATA::Types du CPAN, en
mélangeant les regex et is_int().

Pour ceux qui voudraient d'en servir, il n'y a pas d'exportation
automatique, l'appel de is_int se fait par :

use DATA::Types qw/is_int/;

Bonne journée à tous.

C. Tobini
Avatar
Paul Gaborit
À (at) 6 Apr 2006 05:58:56 -0700,
"ctobini" écrivait (wrote):
Bon, je m'en suis sorti avec le module DATA::Types du CPAN, en
mélangeant les regex et is_int().

Pour ceux qui voudraient d'en servir, il n'y a pas d'exportation
automatique, l'appel de is_int se fait par :

use DATA::Types qw/is_int/;


C'est un module bien élevé ! Il n'exporte que ce qu'on lui demande
explicitement d'exporter et ne pollue donc pas intempestivement votre
espace de nommage.

Tous les modules devraient faire de même...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Bonsoir,

Je suis tout à fait d'accord, il n'empêche qu'en débutant, ce n'est
pas forcément un réflex :)

C. Tobini
Avatar
Vinii
ctobini a pensé très fort :
Bonjour,

Je voudrais parser un fichier CSV avec certaines lignes comme :

Valeurs;10;12;15;26

Je suis en train de me casser la tête pour avoir une expression
régulière:

si la ligne contient un motif ";quelque_chose_qui_n_est_pas_un_entier;"

mais je crois qu'il n'y a pas moyen de distinguer un entier d'un
flottant en Perl.

Auriez-vous un conseil là-dessus ?

En vous remerciant,

C. Tobini


unless ($s =~ /d/) {
# non ???
}

Avatar
ctobini
Bonjour,

En fait non car d représente un seul nombre et d+ un entier ou
flottant, je ne suis pas arrivé à m'en tirer de cette manière :)

De plus je suis sur un fichier CSV avec des répétitions d'entiers et
flottants, le regex est inclus dans un while(), je trouve la méthode
is_int() beaucoup plus directe dans mon cas.

C. Tobini
Avatar
Stephane Zuckerman
This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.

--698110915-310099441-1144398475=:299901
Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8BIT

Bonjour,

En fait non car d représente un seul nombre et d+ un entier ou
flottant, je ne suis pas arrivé à m'en tirer de cette manière :)


Pardon ?

d est équivalent à [0-9], donc l'ensemble des caractères « numériques »
allant de '0' à '9'. Donc d+ équivaut à [0-9]+.

Bref, pour pouvoir repérer des flottants, il faudrait rajouter quelque
chose du genre

d+(.d*) ou d(.d+)

et d+ permet de capturer un entier comme il faut.

De plus je suis sur un fichier CSV avec des répétitions d'entiers et
Je ne vois pas trop le rapport. Une ligne de fichier CSV, ça se split()e,

non ?

flottants, le regex est inclus dans un while(), je trouve la méthode
is_int() beaucoup plus directe dans mon cas.


--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)
--698110915-310099441-1144398475=:299901--

Avatar
ctobini
J'utilise une boucle :

while (/;(.*);/g) {
if (!is_int($&)) {
action;
last
}
}

Car les utilisateurs sont censés saisir un entier mais peuvent saisir
n'importe quoi, donc, je préfère utiliser !is_int() plutôt que :

if ($& =~ /d+/ && $& !~ /[.,]/)

Je trouve ça plus commode mais je ne suis pas un gourou.

C. Tobini
Avatar
Scetbon Cyril
J'utilise une boucle :

while (/;(.*);/g) {
if (!is_int($&)) {
action;
last
}
}


attention, comme le dit la doc :


The use of this variable anywhere in a program imposes a con-
siderable performance penalty on all regular expression
matches. See "BUGS".

mieux vaut donc utiliser $1 a la place de $&
Car les utilisateurs sont censés saisir un entier mais peuvent saisir
n'importe quoi, donc, je préfère utiliser !is_int() plutôt que :

if ($& =~ /d+/ && $& !~ /[.,]/)

Je trouve ça plus commode mais je ne suis pas un gourou.

C. Tobini