заменить URL-адреса в тексте ссылками на URL-адреса

Использование Python Я хочу заменить все URL-адреса в тексте текстом ссылками на эти URL-адреса, например, что делает Gmail. Можно ли это сделать в одном линейном выражении?

Изменить: по тексту текста я просто имел в виду простой текст – без HTML

  • Как индексировать URL-параметры в Python?
  • Есть ли функция для Python, которая похожа на getimagesize в PHP?
  • urllib.request.urlopen (url) с аутентификацией
  • Как отправить запрос POST как JSON?
  • Преобразовать имя файла в файл: // URL
  • Как удалить любой URL-адрес в строке в Python
  • Словарь Python для URL-параметров
  • os.path.basename работает с URL-адресами, почему?
  • 5 Solutions collect form web for “заменить URL-адреса в тексте ссылками на URL-адреса”

    Вы можете загрузить документ с помощью библиотеки разбора DOM / HTML (см. Html5lib), захватить все текстовые узлы, сопоставить их с регулярным выражением и заменить текстовые узлы заменой регулярного выражения URI на привязки вокруг него с помощью PCRE, например :

     /(https?:[;\/?\\@&=+$,\[\]A-Za-z0-9\-_\.\!\~\*\'\(\)%][\;\/\?\:\@\&\=\+\$\,\[\]A-Za-z0-9\-_\.\!\~\*\'\(\)%#]*|[KZ]:\\*.*\w+)/g 

    Я вполне уверен, что вы можете прорваться и найти какую-то полезность, которая делает это, но я не могу думать ни о чем с моей головы.

    Изменить: попробуйте использовать ответы здесь: Как мне получить уценку python для дополнительных ссылок на urlify при форматировании обычного текста?

     import re urlfinder = re.compile("([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+):[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\),\\\"]") def urlify2(value): return urlfinder.sub(r'<a href="\1">\1</a>', value) 

    вызовите urlify2 в строке, и я думаю, что это так, если вы не имеете дело с объектом DOM.

    Я много охотился, пробовал эти решения и не был доволен их читабельностью или возможностями, поэтому я перевернул следующее:

     _urlfinderregex = re.compile(r'http([^\.\s]+\.[^\.\s]*)+[^\.\s]{2,}') def linkify(text, maxlinklength): def replacewithlink(matchobj): url = matchobj.group(0) text = unicode(url) if text.startswith('http://'): text = text.replace('http://', '', 1) elif text.startswith('https://'): text = text.replace('https://', '', 1) if text.startswith('www.'): text = text.replace('www.', '', 1) if len(text) > maxlinklength: halflength = maxlinklength / 2 text = text[0:halflength] + '...' + text[len(text) - halflength:] return '<a class="comurl" href="' + url + '" target="_blank" rel="nofollow">' + text + '<img class="imglink" src="http://img.rupython.com/pythonlinkout.png"></a>' if text != None and text != '': return _urlfinderregex.sub(replacewithlink, text) else: return '' 

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

     /\w+:\/\/[^\s]+/ 

    Когда вы говорите «тело текста», вы имеете в виду простой текстовый файл или основной текст в HTML-документе? Если вам нужен документ HTML, вам нужно будет использовать Beautiful Soup для его анализа; затем выполните поиск по тексту тела и вставьте теги.

    Согласование фактических URL-адресов, вероятно, лучше всего сделать с модулем urlparse . Полное обсуждение здесь: как вы проверяете URL с регулярным выражением в Python?

    Gmail гораздо более открыта, когда дело доходит до URL-адресов, но это не всегда так. например, он сделает сайт http://www.ab в гиперссылке, а также http: // ab, но часто он терпит неудачу из-за обернутого текста и необычных (но действительных) символов URL.

    См. Приложение AA Collected BNF для URI для синтаксиса и используйте его для создания разумного регулярного выражения, которое будет учитывать то, что окружает URL. Вам будет рекомендовано рассмотреть несколько сценариев, в которых URL-адреса могут закончиться.

    Python - лучший язык программирования в мире.