Python re.sub заменить на согласованный контент

Пытаясь справиться с регулярными выражениями в Python, я пытаюсь вывести некоторый HTML, выделенный в части URL. Мой вход

images/:id/size 

мой результат должен быть

 images/<span>:id</span>/size 

Если я сделаю это в Javascript

 method = 'images/:id/size'; method = method.replace(/\:([az]+)/, '<span>$1</span>') alert(method) 

Я получаю желаемый результат, но если я это сделаю в Python

 >>> method = 'images/:id/huge' >>> re.sub('\:([az]+)', '<span>$1</span>', method) 'images/<span>$1</span>/huge' 

Я не знаю, как я могу заставить Python возвращать правильный результат, а не $1 ? Является re.sub даже правильная функция для этого?

Просто используйте \1 вместо $1 :

 In [1]: import re In [2]: method = 'images/:id/huge' In [3]: re.sub(r'(:[az]+)', r'<span>\1</span>', method) Out[3]: 'images/<span>:id</span>/huge' 

Также обратите внимание на использование необработанных строк ( r'...' ) для регулярных выражений. Это не обязательно, но устраняет необходимость избегать обратной косой черты, возможно, делает код более читаемым.

Используйте \1 вместо $1 .

\ number Соответствует содержимому группы с тем же номером.

http://docs.python.org/library/re.html#regular-expression-syntax

Для части замены Python использует \1 способ sed и vi, а не $1 это делают Perl, Java и Javascript (среди других). Кроме того, поскольку \1 интерполирует в регулярных строках как символ U + 0001, вам нужно использовать необработанную строку или \ escape it.

 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(':([az]+)', r'<span>\1</span>', method) 'images/<span>id</span>/huge' >>>