Подтвердить что ты не робот

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

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

images/:id/size

мой вывод должен быть

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

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

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

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

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

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

4b9b3361

Ответ 1

Просто используйте \1 вместо $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'

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

Ответ 3

Для части замены 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(':([a-z]+)', r'<span>\1</span>', method)
'images/<span>id</span>/huge'
>>> 

Ответ 4

Обратная ссылка на полное значение совпадения \g<0>, см. Документацию re.sub:

Обратная ссылка \g<0> подставляет во всю подстроку, совпадающую с RE.

Посмотрите демо Python:

import re
method = 'images/:id/huge'
print(re.sub(r':[a-z]+', r'<span>\g<0></span>', method))
# => images/<span>:id</span>/huge