Ссылка Python re.sub назад не назад

У меня есть следующее:

<text top="52" left="20" width="383" height="15" font="0"><b>test</b></text>

и у меня есть следующее:

fileText = re.sub("<b>(.*?)</b>", "\1", fileText, flags=re.DOTALL)

В котором fileText - это строка, которую я опубликовал выше. Когда я распечатываю fileText после запуска замены регулярного выражения, я возвращаюсь

<text top="52" left="20" width="383" height="15" font="0"></text>

вместо ожидаемого

<text top="52" left="20" width="383" height="15" font="0">test</text>

Теперь я достаточно разбираюсь в регулярном выражении, и я знаю, что он должен работать, на самом деле я знаю, что он правильно соответствует, потому что я вижу его в groups, когда я выполняю поиск и распечатываю groups, но я я новичок в python и не понимаю, почему он не работает с обратными ссылками правильно

Ответы

Ответ 1

Здесь вам нужно использовать raw-string, чтобы обратная косая черта не обрабатывалась как escape-символ:

>>> import re
>>> fileText = '<text top="52" left="20" width="383" height="15" font="0"><b>test</b></text>'
>>> fileText = re.sub("<b>(.*?)</b>", r"\1", fileText, flags=re.DOTALL)
>>> fileText
'<text top="52" left="20" width="383" height="15" font="0">test</text>'
>>>

Обратите внимание, что "\1" было изменено на r"\1". Хотя это очень небольшое изменение (один символ), он имеет большой эффект. См. Ниже:

>>> "\1"
'\x01'
>>> r"\1"
'\\1'
>>>