Ваша настоящая проблема - строка:
text_rep = ext.replace(email_str, '<a href "email_str">email_str</a>')
Это именно то, что вы говорите, но то, что вы хотите, это:
text_rep = ext.replace(email_str, f'<a href "{email_str}">{email_str}</a>')
Вместо того, чтобы заменить почтовый адрес этой литеральной строкой на email_str
, он форматирует строку так, чтобы в ней был почтовый адрес. Предполагается, что вы запускаете Python 3, для Python 2 это будет выглядеть примерно так:
text_rep = ext.replace(email_str, '<a href "{email_str}">{email_str}</a>'.format(email_str=email_str))
Тем не менее, обратите внимание, что ваше регулярное выражение для сопоставления почтовых адресов делает некоторые предположения, лучшую версию можно найти здесь Разрешено ли содержать адреса электронной почты не буквенно-цифровыми символами?
Кроме того, ваш код предполагает, что в исходной текстовой строке будет только один почтовый адрес, когда вы присоединяетесь к результатам. Лучшим решением может быть решение, которое заменяет каждый отдельный почтовый адрес правильной заменой.
import re
input_text = 'For further details, contact admin@mywebsite.org or the webmaster webmaster123@hotmail.com'
output_text = re.sub(
r'(?sm)(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})',
r'<a href="\g<0>">\g<0></a>', input_text)
print(output_text)
Обратите внимание, что для этого не требуется ничего, кроме простого re.sub
.