OVH Cloud OVH Cloud

regexp, module 're'

5 réponses
Avatar
Rakotomandimby (R12y) Mihamina
Bonjour,

J'utilise un produit Zope qui s'appelle CMFBoard.
Ce produit a un petit bug agacant. Je vous le décris.

Dans les BulletinBoard tels phpBB on peut ecrire des messages avec un
langage a balise simplifié. Pour phpBB ils ont appelé ca le BBcode.

C'est presque pareil au HTML mais avec des [tag="attribut"] ... [/tag].

Il se trouve qua CMFborad a aussi son langage "BBcode" mais qui n'a pas de
nom. Son "parseur"/"transcodeur en HTML" est buggé:

Par exemple, si j'ai

"""
[url="http://toto"]urltoto[/url] du texte [url="http://titi"]urltiti[/url]
"""

Alors il devrait me donner un truc comme:

<a href="http://toto">urltoto</a> du texte
<a href="http://titi">urltiti</a> .

Malheureusement, il donne ceci :

<a href"http://toto"]urltoto[/url] du texte [url="http://titi">urltiti</a>

Je l'explique tres bien ici :
http://www.cmfboard.org/forums/cmfboard/bugs/0164897765943

J'ai jetté un oeil au code source.
Je pense que probleme est du a la regexp qui est mal faite: Elle est en
mode "gourmand" (glouton).

C'est a dire qu'elle regarde le premier " , puis ensuite elle cherche le
" correspondant, mais le " correspondant est, pour elle, le dernier. Cela
de part le fait qu'il est "glouton".

Voici le morceau de code qui correspond :

import re, traceback
import string

[snip ...]

attrfind = re.compile(
r'[ \t\r\n]*([a-zA-Z_][-.a-zA-Z_0-9]*)'
r'([ \t\r\n]*=[ \t\r\n]*'
r'(\'[^\']*\'|"[^"]*"|\&quot;[^"]*&quot;|[-a-zA-Z0-9./:+*%?!\(\)_#=~]*))?',
re.UNICODE)
[...]


Si vous avez remarqué ma derniere intervention ici c'etait au sujet des
regexp et du module 're', et justement depuis ce temps je n'arrive pas a
decoder cette chose.

Comment s'y prendre pour decomposer cette regexp ultra compliquée en
petits morceaux plus compréhensibles? Faut que je rectifie ce bug
parcequ'on aura besoin de ce CMFBoard mais sans ce bug dans quelques temps.

Merci d'avance.
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)

5 réponses

Avatar
Yermat
Rakotomandimby (R12y) Mihamina wrote:
Bonjour,
[...]
import re, traceback
import string

[snip ...]

attrfind = re.compile(
r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)'
r'([ trn]*=[ trn]*'
r'('[^']*'|"[^"]*"|&quot;[^"]*&quot;|[-a-zA-Z0-9./:+*%?!()_#=~]*))?',
re.UNICODE)
[...]


Ben a priori non !
ex : "[^"]*"
Ceci ne devrait matcher que un guillemet suivit de plusieurs caractères
qui ne sont pas des guillemets et enfin un guillemet. Donc greedy ou
pas, cela devrait matcher ce que tu veux... Sinon tu peux toujours
essayer "[^"]*?"...

Faudrait plutôt voir l'utilisation de ces regexp.

Ah moins que j'ai loupé quelque chose ? !

--
Yermat

Avatar
Rakotomandimby (R12y) Mihamina
( Tue, 14 Dec 2004 17:10:09 +0100 ) Yermat :

r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)'
r'([ trn]*=[ trn]*'
r'('[^']*'|"[^"]*"|&quot;[^"]*&quot;|[-a-zA-Z0-9./:+*%?!()_#=~]*))?',


Faudrait plutôt voir l'utilisation de ces regexp.


Il faut que je les comprenne d'abord.

Ah moins que j'ai loupé quelque chose ? !


C'est moi qui ai loupé des choses.
Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus
simples, ca serait cool.
Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi
il l'a fait en trois lignes.

Je mets ici le fichier de code entier:
http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download
(Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))

--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)


Avatar
Yermat
Rakotomandimby (R12y) Mihamina wrote:
( Tue, 14 Dec 2004 17:10:09 +0100 ) Yermat :
[...]
C'est moi qui ai loupé des choses.
Si tu pouvais, par exemple m'aider a decomposer ces regexps en plus
simples, ca serait cool.
Je veux dire ... expliquer morceau par morceau, et aussi me dire pourquoi
il l'a fait en trois lignes.

Je mets ici le fichier de code entier:
http://faq.fcolc.eu.org/Members/mihamina/divers/forum_codes.py.html/download
(Il est coloré syntaxiquement, facile a lire, mais pas facile pour moi :-))


Déjà un petit tour dans la doc pourra t'aider :

Les trois lignes c'est, a priori, que pour la lisibilité. J'ai fait le
test et en une ligne, c'est le même résultat ! Je ne savais pas que cela
marchait...

Reprenons dans l'ordre :
1) r'[ trn]*([a-zA-Z_][-.a-zA-Z_0-9]*)'
[ trn]* -> reconnais plusieurs espace, tabulation ou retour à la
ligne. Pourquoi ne pas avoir choisit s* ?
[a-zA-Z_] reconnais une lettre ou un souligné.
[-.a-zA-Z_0-9]* suivit de plusieurs lettres, chiffres ou tiret ou point
ou souligné.

en fait 1) reconnais la partie nom de l'element.

2) r'([ trn]*=[ trn]*'
on reconnais maintenant presque n'importe quel blanc suivit d'un égal
puis de (presques tous les) blancs.

3)
r'('[^']*'|"[^"]*"|&quot;[^"]*&quot;|[-a-zA-Z0-9./:+*%?!()_#=~]*))?'

commencons par la fin : le dernier point d'interrogation indique que cet
élément est optionel. En fait c'est même le 2) et 3) qui le sont !

les différents | indique un choix donc a|b reconnait soit a soit b.

'[^']*' -> on reconnait un guillement simple suivit de tout sauf un
guillement suivit d'un guillemet simple.

"[^"]*" -> on reconnait un guillement double suivit de tout sauf un
guillement suivit d'un guillemet double.

&quot;[^"]*&quot; -> on reconnait un &quot; suivit de tout sauf un
guillement double suivit d'un &quot;.

[-a-zA-Z0-9./:+*%?!()_#=~]* -> on reconnait plusieurs de ces caractères.

Pour finir, dés qu'il y a des parenthèses, on pourra récuperer le
pattern plus tard.

Visiblement, cette regexp doit bien faire ce que on lui demande,
analyser qu'un seul url="http://toto" et renvoyer (url, http://toto).
Toujours a priori c'est avant qu'il faut revoir ce que l'on passe à
cette regexp...


Je vais essayer de regarder un peu mais bon...

--
Yermat

Avatar
Tibi
On Tue, 14 Dec 2004 16:00:53 +0100, Rakotomandimby (R12y) Mihamina
wrote:

Comment s'y prendre pour decomposer cette regexp ultra compliquée en
petits morceaux plus compréhensibles? Faut que je rectifie ce bug


Un petit programme bien pratique quand on joue avec des regexps:
http://kodos.sourceforge.net/

Avatar
Rakotomandimby (R12y) Mihamina
( Tue, 14 Dec 2004 21:13:39 +0100 ) Yermat :
[...]
Je vais essayer de regarder un peu mais bon...


Merci beaucoup.
La, j'ai une urgence alors je peux pas continuer la discussion mais je
reviens des que c'est reglé?

--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)