OVH Cloud OVH Cloud

Expression régulière ?

9 réponses
Avatar
p_geni...
Bonjour,

je cherche à compter le nombre de '>' (éventuellement
séparés par des espace) au début d'une ligne

Je m'explique :

Supposons qu'on a la ligne suivante

$l = ' > >> comment vas-tu ? > je vais > bien...';

je ne souhaite compter que le nombre de '>' (éventuellement
séparés par des espaces) au début de la ligne
ici 3.

J'ai essayé plusieurs expressions sans succès

while ( $l =~ />/g) {
$c++;
}

print "trouvé $c\n";


Je souhaite, si possible, une expressions régulière rapide
car je vais traiter un fichier imposant.

Merci de votre aide.

Pierre.




-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/

9 réponses

Avatar
Rue des Prairies
Bonjour,

je cherche à compter le nombre de '>' (éventuellement
séparés par des espace) au début d'une ligne

Je m'explique :

Supposons qu'on a la ligne suivante

$l = ' > >> comment vas-tu ? > je vais > bien...';

je ne souhaite compter que le nombre de '>' (éventuellement
séparés par des espaces) au début de la ligne
ici 3.

J'ai essayé plusieurs expressions sans succès

while ( $l =~ />/g) {
$c++;
}

print "trouvé $cn";


Je souhaite, si possible, une expressions régulière rapide
car je vais traiter un fichier imposant.

Merci de votre aide.

Pierre.



Bonjour,

$c++ while($l =~ s/^s*>//);

Olivier.

Avatar
p_geni...
Rue des Prairies wrote:

$c++ while($l =~ s/^s*>//);


Merci pour cette réponse rapide.

Je n'ai pas pensé à l'opérateur s///;

L'expression focntionne, je vais mainteneant
tester sur mes fichier de taille importante et espère avoir
des performances convenables.

Pierre.
-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/

Avatar
Jul
Pierre Génieys a formulé ce samedi :
Rue des Prairies wrote:

$c++ while($l =~ s/^s*>//);


Merci pour cette réponse rapide.

Je n'ai pas pensé à l'opérateur s///;

L'expression focntionne, je vais mainteneant
tester sur mes fichier de taille importante et espère avoir
des performances convenables.


Bonjour,

Si ce n'est que pour compter le nombre d'occurence, l'application de
cette expression régulière n'est pas la plus rapide :o) (elle
transforme la ligne, ce qui n'est pas nécessaire).
Il est normalement plus intéressant ici d'utiliser un marqueur de
position comme nous le permet nos chère expressions :o)

my @c;
open(FILE, "<file.ext");
while (my $l = <FILE>) do {
my $c = 0;
# on reinitialise le compteur de position à 0 (début de ligne)
pos ($l) = 0;
# ne pas oublier le marqueur /g
# G est le marqueur de position de la rec précédente
$c++ while ( $l =~ m/Gs*>/g );
push (@c, $c);
};

Normalement (s'il n'y a pas d'erreur dans le code :D), ça te retourne
le nombre de > (précédé ou non d'espaces) au début de chaque ligne du
fichier. Tu peux récupérer le numéro de la ligne correspondante par les
index du tableau ($c[0] -> première ligne, etc). Sinon, tu peux
l'adapter pour une consomation de ressources moins excessive (suprrimer
l'utilisation du tableau et travailler sur les résultats en live dans
la première boucle while).

--
Jul... réapparru comme par enchantement


Avatar
Jul
oups, j'ai oublié de fermé le FILEHANDLE à la fin :o)

--
Jul... réapparru comme par enchantement
Avatar
Jacques Caron
On 26 Mar 2005 08:25:01 GMT, Pierre Génieys wrote:

$l = ' > >> comment vas-tu ? > je vais > bien...';

je ne souhaite compter que le nombre de '>' (éventuellement
séparés par des espaces) au début de la ligne
ici 3.


Juste histoire d'éviter des boucles:

$l =~ s/s//g;
$l =~ s/[^>].*$//;
$c = length $l;

Ou

$l =~ /^([s>]*)/ && ($l = $1);
$l =~ s/s//g;
$c = length $l;

Ou

$c = ($l =~ s/(^|G)s*>//g);

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/

Avatar
Nicolas George
"Jul" wrote in message :
oups, j'ai oublié de fermé le FILEHANDLE à la fin :o)


D'où l'intérêt d'utiliser un $filehandle et l'autovivification.

Avatar
Jérémy JUST
On Sat, 26 Mar 2005 14:14:05 +0100
"Jacques Caron" wrote:

$l =~ /^([s>]*)/ && ($l = $1);
$l =~ s/s//g;
$c = length $l;


Je propose une solution proche, mais sûrement plus rapide car je ne
modifie aucune chaîne:

<<<<<<
my $l = ' > >> comment vas-tu ? > je vais > bien...';

if ($l =~ m/(s*>)*/ )
{$c = ($& =~ y/>//) ;
}









On peut accélérer encore un peu avec:

<<<<<
if ($l =~ m/((?:s*>)*)/ )
{$c = ($1 =~ y/>//) ;
}







(je n'ai pas benchmarké pour vérifier que c'est plus rapide)

--
Jérémy JUST






Avatar
p_geni...
Jérémy JUST wrote:

my $l = ' > >> comment vas-tu ? > je vais > bien...';

if ($l =~ m/(s*>)*/ )
{$c = ($& =~ y/>//) ;
}



<<<<<
if ($l =~ m/((?:s*>)*)/ )
{$c = ($1 =~ y/>//) ;
}







Je suis plutôt pour votre 2ème solution bien que je ne suis
pas fort dans les expressions régulières avec les smiley ?:

Je pense (mais peux me tromper) que l'utilisation de la variable $&,
$MATCH est déconseillée

extrait de la doc de perl
..
The use of this variable anywhere in a program imposes a considerable
performance penalty on all regular expression matches. See "BUGS".
..

Merci à tous de vos réponses.

Pierre.

-----
échangez opinions et commentaires dans les forums de discussion.
http://www.usenetgratuit.com/





Avatar
Jérémy JUST
On 26 Mar 2005 16:43:58 GMT
(Pierre Génieys) wrote:

Je suis plutôt pour votre 2ème solution bien que je ne suis
pas fort dans les expressions régulières avec les smiley ?:


Ce « smiley » fait juste que les parenthèses ne mémorisent pas dans $2
(pour gagner un peu de temps).


Je pense (mais peux me tromper) que l'utilisation de la variable $&,
$MATCH est déconseillée

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


Oui.
Si ton programme utilise comme seule regexp celle que l'on
discute ici, l'utilisation de $& ne devrait pas dégrader les
performances.
Si tu as plus de regexps, à partir du moment où tu auras utilisé
*une fois* $&, pour *chacune* des regexps, Perl renseignera les trois
variables $&, $' et $`; si tu ne t'en sers pas, c'est une perte de
temps.

En gros, ces trois variables ne sont à utiliser que si on en a
l'utilité à plusieurs reprises.

--
Jérémy JUST