Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

expression reguliere ouh la la

4 réponses
Avatar
Thierry Schembri
Bonsoir à tous,

Je ne suis pas un expert en expression régulière, en plus, je ne
développe pas en Perl, mais je me suis dis que les développeurs Perl
étant des experts en expressions régulières, l'un d'entre eux va
surement pouvoir m'aider ;-)

Je cherche un moyen de rechercher de façon efficace un mot dans une
page html (contenant, hélas, des tags HTML).

Je procéde donc en deux temps :

1) élimination des tags (hum) avec cette expression : "<(.|\n)+?>" (a
chaque occurence, je remplace par "")
2) recherche du mot, alors là, empiriquement, j'arrive a cette
expression usinagazesque :
(?<=[\s>(, ':.?!]) + mon_mot_recherché + (?=[\s<, ):.?!])
Expression qui, au passage ne fonctionne pas si le mot en question
commence ou termine mon buffer... (et surement dans d'autres cas)

Ma question est simple : peut-on faire plus simple et que ca marche
;-))) ?

Merci d'avance !

4 réponses

Avatar
Jacques Caron
Salut,

On Thu, 13 Oct 2005 23:08:29 +0200, Thierry Schembri
wrote:

Je ne suis pas un expert en expression régulière, en plus, je ne
développe pas en Perl, mais je me suis dis que les développeurs Perl
étant des experts en expressions régulières, l'un d'entre eux va
surement pouvoir m'aider ;-)


Va falloir nous dire de quel type d'expressions régulières il s'agit,
alors, parce que perl a pas mal d'extensions qui ne sont pas dans les
expressions régulières "standard". Et même dans les regexp "standard", il
va falloir nous dire au moins si ce sont des regexp "basiques" ou
"étendues". Idéalement, il faudrait nous dire quel est le langage ou
logiciel utilisé, il y a souvent tout plein de petites subtilités...

Je cherche un moyen de rechercher de façon efficace un mot dans une page
html (contenant, hélas, des tags HTML).

Je procéde donc en deux temps :

1) élimination des tags (hum) avec cette expression : "<(.|n)+?>" (a
chaque occurence, je remplace par "")


a. la meilleure solution est d'utiliser un parser HTML, parce qu'avec ce
genre de regexp tu vas avoir de mauvaises surprises, c'est garanti.
b. Sinon, en perl, un bête s/<.*>//gs ferait l'affaire.
c. Note que comme il semblerait que tu cherches un mot "isolé" (i.e. pas
une partie de mot), il vaudrait mieux remplacer par un espace que par
rien, sinon tu vas coller des mots.

2) recherche du mot, alors là, empiriquement, j'arrive a cette
expression usinagazesque :
(?<=[s>(, ':.?!]) + mon_mot_recherché + (?=[s<, ):.?!])


Euh, c'est quoi le but du jeu, trouver le mot "isolé" et pas un morceau de
mot?
En perl, /bmotrechercheb/ suffit. Sinon de façon plus générique je pense
que /[[:<:]]motrecherche[[:>:]]/ doit faire l'affaire, à condition d'avoir
la bonne locale bien entendu.

Expression qui, au passage ne fonctionne pas si le mot en question
commence ou termine mon buffer... (et surement dans d'autres cas)

Ma question est simple : peut-on faire plus simple et que ca marche
;-))) ?


RTFM?

Jacques.
--
Oxado http://www.oxado.com/

Avatar
Paul Gaborit
À (at) Fri, 14 Oct 2005 00:11:05 +0200,
"Jacques Caron" écrivait (wrote):
[...]
b. Sinon, en perl, un bête s/<.*>//gs ferait l'affaire.
c. Note que comme il semblerait que tu cherches un mot "isolé"
(i.e. pas une partie de mot), il vaudrait mieux remplacer par un
espace que par rien, sinon tu vas coller des mots.


Donc :

s/<.*?>/ /gs;

Pour que ça marche (à peu près) il faut désactiver la gourmandise (ou
« gloutonnerie ») du quantificateur.

On Thu, 13 Oct 2005 23:08:29 +0200, Thierry Schembri
wrote:
[...]

Ma question est simple : peut-on faire plus simple et que ca marche
;-))) ?



Pour que ça marche... *à* *tous* *les* *coups*, la seule bonne
solution est un parseur HTML. C'est effectivement plus simple à
utiliser. ;-)


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


Avatar
Thierry Schembri
D'abord merci d'avoir répondu, ça fait bien plaisir !

Idéalement, il faudrait nous dire quel est le langage ou logiciel utilisé,
il y a souvent tout plein de petites subtilités...


Le langage utilisé est C# avec le framework 2.0

a. la meilleure solution est d'utiliser un parser HTML, parce qu'avec ce
genre de regexp tu vas avoir de mauvaises surprises, c'est garanti.


J'en ai, hélas, bien conscience, mais parser entierement chaque
document à scanner risque d'être trop gourmand, tant pis si ce n'est
pas "parfait à 100%" :-(

b. Sinon, en perl, un bête s/<.*>//gs ferait l'affaire.


merci du renseignement

Euh, c'est quoi le but du jeu, trouver le mot "isolé" et pas un morceau de
mot?


Le but du jeu est de retrouver un mot (complet) ou éventuellement une
expression (complete) : ie: si je cherche "toto", il ne doit pas
retrouver le mot "tototo", si je cherche "bonjour toto", il ne doit pas
retrouver "rebonjour tototo".

En perl, /bmotrechercheb/ suffit. Sinon de façon plus générique je pense
que /[[:<:]]motrecherche[[:>:]]/ doit faire l'affaire, à condition d'avoir
la bonne locale bien entendu.


J'essaye ça.
Question de beotien, c'est quoi la bonne locale ?

Avatar
Antoun
(...)

J'essaye ça.
Question de beotien, c'est quoi la bonne locale ?




la locale est un paramètre précisant une série de petites normes sur le
pays et/ou la langue à prendre en compte.

Par exemple, si je passe sans locale la regexp /paraw+/ sur le
paragraphe ci-dessus, elle reconnaîtra "param", parce que par défaut w
est équivalent à [a-zA-Z0-9_], et que "è" n'en fait donc pas partie.

Si je lui dis d'utiliser la locale française, "è" sera considéré comme
équivalent à "e" et ma regex reconnaîtra donc "paramètre".

A noter que les locales sont définies par des normes POSIX.