Extraire un mot d'une ligne suivant ce qui l'encadre - Perl - Programmation
Marsh Posté le 09-06-2011 à 19:26:18
/(^|[\s\t.;])all([\s\t.;]|$)/oi
A+,
Marsh Posté le 09-06-2011 à 21:28:40
Ah oui forcement, j'étais mal parti.
D'abord merci beaucoup.
Puis, je connais le i, que signifie le 'o' aprés le dernier / ?
Je dis peut être une ânerie mais \t n'est pas compris dans \s?
Marsh Posté le 10-06-2011 à 11:01:05
Citation : Je dis peut être une ânerie mais \t n'est pas compris dans \s? |
Tout a fait, j'ai tapé sans me relire (juste fait un test rapide avec un script).
C'est /(^|[ \t.;])all([ \t.;]|$)/oi qui correspond exactement à tes specs. Ou bien /(^|[\s.;])all([\s.;]|$)/oi si la notion d'espace de ta spec ne désigne pas que le blanc..
Citation : Puis, je connais le i, que signifie le 'o' aprés le dernier / ? |
o = once: on ne compile qu'une fois l'expression, car rien a l'intérieur ne va changer à chaque pattern matching. C'est une optimisation et une bonne habitude à prendre.
A+,
Marsh Posté le 10-06-2011 à 11:33:01
Merci beaucoup Gilou pour tes explications.
Tu as raison, j'avais oublié de spécifier ce que j'entendais par blanc (espaces et/ou tab)
Euh, excuses moi, j'ai encore une question :
Dans l'absolut je voudrais utiliser cette expression pour recherche plusieurs mots. C'est à dire j'ai une liste de mots, et je voudrais faire cette recherhe avec chaque mots de la liste.
J'ai donc :
Code :
|
Cependant, il ne prend pas $item comme étant une variable mais la chaine à chercher. Comme lui faire comprendre l'inverse?
Ps : j'imagine que dans ce cas, l'option o n'est plus utile puisque l'expression va changer suivant le mot. J'ai bon?
Marsh Posté le 10-06-2011 à 17:54:54
Bon je me réponds tout seul.
Je suis un âne, bien que tu m'es expliqué que l'opérateur o ne signifiait qu'il ne compilait l'expression qu'une fois. Or si je change la variable dedans ca risque de pas marcher.
Merci.
Marsh Posté le 10-06-2011 à 18:01:48
Tout à fait.
Notes que si tu utilises l'option strict (use Strict;) qui est recommandée, il vaudrait mieux écrire:
foreach my $item (@liste)
et d'autre part, pour //(^|[\s.;])$item([\s.;]|$)/oi il y aurait pas un / en trop au début?
A+,
Marsh Posté le 10-06-2011 à 19:07:12
Pour trouver les mots d'une liste dans un texte donné, voici un exemple, pas nécessairement le plus optimal.
Code :
|
#construction du hash:
grep {/(^|[\s.;])$item([\s.;]|$)/i} @array; retourne une liste des lignes de array ou l'expression régulière donnée est trouvée
comme on est dans un contexte scalaire, $result{$item} = va avoir pour effet d'assigner le nb d'éléments de cette liste à $result{$item}, et donc 0 si $item n'a pas été trouvé.
A+,
Marsh Posté le 14-06-2011 à 13:37:50
Salut Gilou,
Merci pour tes réponses.
En fait, je me suis mal exprimé dés le début, ce que je voudrais en réalité, c'est afficher les lignes ou au moins l'un des ces mots clés n'est pas en majuscules.
Marsh Posté le 14-06-2011 à 20:18:53
Un truc comme ça alors:
Code :
|
L'idée: sur les lignes qui ont au moins un mot clé, on vire tous les mots clés en majuscule qui y figurent, et si on y trouve encore un mot clé, c'est qu'il y avait au moins un mot clé qui n'était pas en majuscule.
On pourrait se passer de la ligne 11, i.e. on vire tous les mots clés en majuscule de toute ligne, et si on y trouve encore un mot clé, c'est qu'il y avait au moins un mot clé qui n'était pas en majuscule dans la ligne, mais ça fait traiter inutilement des lignes et n'est pas optimal.
J'ai écrit la partie entre les lignes 9 et 15 pour que ce soit assez optimal (je vois pas trop comment optimaliser plus) et que ça ne modifie pas ce qu'on teste (cas par exemple ou la liste est en fait un fichier lié avec Tie::File).
Note: le blanc qui apparaît avant la parenthèse fermante de la définition de $regexp est un artéfact du code d'affichage du forum.
A+,
Marsh Posté le 09-06-2011 à 16:08:19
Bonjour,
je développe un petit script en perl (pour l'utilité et aussi pour apprendre), et j'ai besoin d'extraire un mot d'une ligne.
En fait je lit un fichier ligne par ligne.
Exemple de fichier
bla
bla
bla.all
all blabla
retour ALL;
ball
return all return;
Donc, je cherche a extraire des lignes le mot "all" seulement (sans distinction de casse). Il peut être encadré par :
des espaces
des tabulation
une fin de ligne
un début de ligne
un point (.)
un point virgule (
mais rien d'autres.
Je suis arrivé (mais sans grand résultat) à l'expression suivante :
mais je n'obtiens pas la ligne 3 ("bla.all" )
merci de vos réponses.
---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)