Две ошибки в вашем коде. Во-первых, вы не соответствуете (и, в частности, захватываете) то, что, по вашему мнению, соответствует и захватываете - вставьте после вашего звонка .search
:
>>> _.groups()
('',)
Неограниченное повторение (звезда после захвата группы, в которой только звезды) совпадает слишком много - с пустой строкой в конце того, что вы считаете совпадающим - и это то, что захватывается. Исправьте, изменив хотя бы одну из звезд на плюс, например, на:
>>> pat_error = re.compile(r">(\s*\w+)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0x83ba0>
>>> _.groups()
(' the',)
Теперь ЭТО сопоставляет и фиксирует разумно. Во-вторых, вы не используете синтаксис необработанных строковых литералов там, где должны, поэтому у вас нет обратной косой черты там, где вы думаете, что она есть - у вас есть escape-последовательность \1
, которая совпадает с chr (1). Исправить, используя синтаксис необработанных строковых литералов, то есть после приведенного выше фрагмента
>>> pat_error.sub(r">\1", text)
'<hi type="italic"> the</hi>'
В качестве альтернативы вы можете удвоить все обратные слэши, чтобы избежать их использования в качестве начала escape-последовательностей, но синтаксис необработанных строковых литералов гораздо более читабелен.