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
правильной функцией?
Ответы
Ответ 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'...'
) для регулярных выражений. Это не обязательно, но избавляет от необходимости избегать обратной косой черты, возможно делая код немного более читабельным.
Ответ 2
Используйте \1
вместо $1
.
\number Соответствует содержимому группы с тем же номером.
http://docs.python.org/library/re.html#regular-expression-syntax
Ответ 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