Ваше регулярное выражение соответствует всему от первых s до последних s, поэтому, если вы замените совпадение на «no», вы получите «thinotring».
Скобки не ограничивают совпадение, они фиксируют совпадение текста, находящегося внутри них, в специальной переменной, называемой обратная ссылка. В вашем примере обратная ссылка номер 1 будет содержать is a
. Позже вы можете ссылаться на обратную ссылку в том же регулярном выражении, используя обратную косую черту и номер обратной ссылки: \1
.
То, что вы, вероятно, хотите, это смотреть:
re.sub(r"(?<=s ).*?(?= s)", "no", "this is a string")
(?<=s )
означает: Утверждать, что можно сопоставить s
до текущей позиции в строке, но не включать ее в соответствие.
То же самое для (?= s)
, но оно утверждает, что строка будет продолжаться с s
после текущей позиции.
Имейте в виду, что просмотр в Python ограничен строками фиксированной длины. Так что, если это проблема, вы можете обойти это, используя ... backreferences !
re.sub(r"(s ).*?( s)", r"\1no\2", "this is a string")
ОК, это надуманный пример, но он показывает, что вы можете сделать. Из вашего редактирования становится очевидным, что вы пытаетесь проанализировать HTML с помощью регулярных выражений. Это не очень хорошая идея. Ищите «regex html», и вы поймете, почему.
Если вы все еще хотите это сделать:
re.sub(r"(<a.*?href=['"])((?!http).*?['"].*?>)", r'\1http://\2', string)
может сработать. Но это очень хрупко.