En essayant de maîtriser les expressions régulières en Python, j'essaie de générer du code HTML mis en évidence dans une partie d'une URL. Mon entrée est
images/:id/size
ma sortie devrait être
images/<span>:id</span>/size
Si je le fais en Javascript
method = 'images/:id/size';
method = method.replace(/\:([a-z]+)/, '<span>$1</span>')
alert(method)
J'obtiens le résultat souhaité, mais si je le fais en Python
>>> method = 'images/:id/huge'
>>> re.sub('\:([a-z]+)', '<span>$1</span>', method)
'images/<span>$1</span>/huge'
Comment ne pas amener Python à renvoyer le résultat correct plutôt que $1
? re.sub
est-il même la bonne fonction pour le faire?
Utilisez simplement \1
au lieu de $1
:
In [1]: import re
In [2]: method = 'images/:id/huge'
In [3]: re.sub(r'(:[a-z]+)', r'<span>\1</span>', method)
Out[3]: 'images/<span>:id</span>/huge'
Notez également l'utilisation de raw strings (r'...'
) pour les expressions régulières. Il n'est pas obligatoire mais élimine le besoin d'échapper des barres obliques inverses, ce qui permet de rendre le code légèrement plus lisible.
Utilisez \1
au lieu de $1
.
\ number Correspond au contenu du groupe du même numéro.
http://docs.python.org/library/re.html#regular-expression-syntax
Pour la partie de remplacement, Python utilise \1
comme le font sed et vi, pas $1
comme le font Perl, Java et Javascript (entre autres). De plus, étant donné que \1
interpole dans les chaînes ordinaires en tant que caractère U + 0001, vous devez utiliser une chaîne brute ou la modifier.
Python 3.2 (r32:88445, Jul 27 2011, 13:41:33)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> method = 'images/:id/huge'
>>> import re
>>> re.sub(':([a-z]+)', r'<span>\1</span>', method)
'images/<span>id</span>/huge'
>>>
La référence arrière à la valeur totale de la correspondance est \g<0>
, voir la documentation re.sub
:
La référence arrière
\g<0>
se substitue dans la totalité de la sous-chaîne mise en correspondance par le RE.
Voir la démo Python :
import re
method = 'images/:id/huge'
print(re.sub(r':[a-z]+', r'<span>\g<0></span>', method))
# => images/<span>:id</span>/huge