web-dev-qa-db-fra.com

Python re.sub remplacer par le contenu correspondant

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?

40
Smudge

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.

70
NPE

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

12
user647772

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'
>>> 
4
tchrist

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
0
Wiktor Stribiżew