OVH Cloud OVH Cloud

extraire des données.

6 réponses
Avatar
arthur.wolf
Bonjour.

Voici mon probleme, je souhaite éxtraire ( c'est dans une page html mais
ca a pas d'importance je crois ) , dans un texte de ce genre :

machin:18bed<br>
bidule:1e42<br>
chose:0..<br>

uniquement les nombres qui se trouvent apres le ":"
ces nombres ont une longueur variable, ils peuvent etre suivis de
lettres, puis de chiffres, mais je ne veux que le premier nombre ( ici :
18, 1, 0 ) ...
Une idée ?
Merci d'avance.

6 réponses

Avatar
Jérémy JUST
On Wed, 19 Jan 2005 00:33:45 +0100
"arthur.wolf" wrote:

machin:18bed<br>
bidule:1e42<br>
chose:0..<br>

uniquement les nombres qui se trouvent apres le ":"
ces nombres ont une longueur variable, ils peuvent etre suivis de
lettres, puis de chiffres, mais je ne veux que le premier nombre


Pour récupérer les nombres qui suivent le signe deux-points, il suffit
d'utiliser cette regexp: /:(d+)/
Quand la regexp a matché, le nombre est dans $1.

Ensuite, il faudrait préciser un peu le contexte si tu veux une
réponse plus adaptée. Ce motif peut-il apparaître plusieurs fois dans la
ligne? Veux-tu récupérer uniquement ce motif quand il est suivi de
<br>?...


--
Jérémy JUST

Avatar
Alain Star
Inserb wrote:

:: my $var=(/:(d+)/, $&);

Aurais-tu la gentillesse d'expliquer ce que fait précisement cette ligne
s'il te plait?

Merci,

AS
Avatar
Inserb
Alain Star wrote:
Inserb wrote:

my $var=(/:(d+)/, $&);



Aurais-tu la gentillesse d'expliquer ce que fait précisement cette
ligne s'il te plait?


Vi.

Je me permet de passer sur my $var
- /:(d+)/ => regexp qui cherche un occurance qui commence par ':'
puis qui contient au moins 1 chiffre dernière mais qui peut en contenir
n
Dans la regexp, 'd' correspond à un chiffre de '0' à '9', et le +
signifie
au moins une fois, et jusqu'à n fois. (* => 0 à n et ? => 0 ou 1 fois).

- $& => correspond au résultat qui dans ce cas va être stocké dans $var.

Donc si on reprend l'exemple initial et en essayant de le traduire pas à
pas,
on a plus ou moins :

machin:18bed<br>

=> recherche d'un occurance qui commence par ':' donc
":18bed<br>"

puis on recherche 1 à n nombres derrière les 2 points en s'arrêtant
au 1er caractère qui n'en sont pas :
=>1 puis 8 et on s'arrête au b

Au final on a donc $var = ':18'

Voilà, ça doit être ça. En espèrant pas avoir fait d'erreur en
développant
trop et avoir été clair...



Avatar
Jérémy JUST
On Wed, 19 Jan 2005 09:54:52 +0100
"Inserb" wrote:

my $var=(/:(d+)/, $&);
$var=~ s/://g;


C'est du gâchis d'utiliser des parenthèses, puis de retraiter ce qui
est dans $&. En plus de consommer plus de CPU et de mémoire, ça rend la
compréhension délicate.

J'aurais vu un simple (je laisse l'enrobage avec le open() en exercice
au lecteur):

while(<MON_FICHIER>)
{if (/:(d+)/)
{print $1, "n" ;
}
}


ou en ligne de commande:

$ perl -ne 'if (/:(d+)/){print $1, "n"}' ma_page.html

--
Jérémy JUST

Avatar
arthur.wolf
Inserb wrote:
arthur.wolf wrote:



Je vais peut etre passer pour un imbécile, mais ... /:(d+)/ , j'en
fait quoi ... je veux dire, comment je me sers de ca pour obtenir ma
liste de nombres ?



En parcourant ta page, tu fais :
my $var=(/:(d+)/, $&);
$var=~ s/://g;

et la $var correspond (dans ton exemple) à 18 puis 1 puis 0, etc....




En fait, je ne parcours pas un fichier, mais une chaine qui contient la
page ( $page ), ou je mets $page dans tout ca ? ( merci de m'aider :) )


Avatar
Inserb
arthur.wolf wrote:
En fait, je ne parcours pas un fichier, mais une chaine qui contient
la page ( $page ), ou je mets $page dans tout ca ? ( merci de m'aider
:) )


Il existe probablement des solutions plus optimisées, mais tu peux
toujours créer un tableau à partir de ta variable et traiter chaque
"case" de ton tableau.

Genre:

my @tableau_page = split (/n/, $page);
foreach(@tableau_page)
{
if (/:(d+)/)
{
print $1, "n";
}
}

Bon, reste à voir si c'est ce qu'il y a de mieux, mais ça marche.