Замените идентификатор электронной почты тегом HTML, чтобы сделать гиперссылку внутри текста - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий текст

For further details, please contact abc.helpdesk@xyz.com

Я хочу заменить идентификатор электронной почты, упомянутый в приведенном выше тексте, на <a href "abc.helpdesk@xyz.com">abc.helpdesk@xyz.com</a>, чтобы идентификатор электронной почты стал интерактивным объектом, когда вышеуказанный текст будет представлен на веб-странице

Пока что я попробовал следующее

text = 'For further details, please contact abc.helpdesk@xyz.com'
email_pat = re.findall(r'[\w\.-]+@[\w\.-]+\.\w+',text)
email_str = ' '.join(email_pat) #converts the list to string
text_rep = ext.replace(email_str,'<a href "email_str">email_str</a>')

Приведенный выше код заменяет строку электронной почты, но вместо создания гиперссылки фактически выполняет следующее

For further details, please contact <a href "email_str">email_str</a>

Есть ли способ справиться с этим?

Редактировать Когда я использую вышеупомянутое решение во Flask, во внешнем интерфейсе я получаю желаемый результат (то есть идентификатор электронной почты становится кликабельным, ссылки становятся кликабельными). Но когда я нажимаю на это, меня перенаправляют на localhost:5002 вместо открытия Outlook. localhost:5002 - это место, где размещается мое приложение Flask. Даже для URL также не работает. Я использую следующий код, чтобы сделать строку URL кликабельной.

text = text.replace('url',f'<a href "{url_link}">{url}</a>'

Приведенный выше код делает строку usr кликабельной, но при нажатии она перенаправляется на localhost:5002 Есть ли какие-либо изменения, которые мне нужно внести в метод app.run(host=5002)?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Ваша настоящая проблема - строка:

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.

0 голосов
/ 21 января 2019

Вы можете использовать re.sub с lambda:

import re
s = 'For further details, please contact abc.helpdesk@xyz.com'
new_s = re.sub('[\w\.]+@[\w\.]+', lambda x:f'<a href="{x.group()}">{x.group()}</a>', s)

Выход:

'For further details, please contact <a href="abc.helpdesk@xyz.com">abc.helpdesk@xyz.com</a>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...