заменить URL в тексте ссылками на URL - PullRequest
8 голосов
/ 13 ноября 2009

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

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

Ответы [ 5 ]

10 голосов
/ 13 ноября 2009

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

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

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

Редактировать: Попробуйте использовать ответы здесь: Как получить python-markdown для дополнительного "ссылки" на ссылки при форматировании простого текста?

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.

6 голосов
/ 29 июня 2011

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

_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="/images/linkout.png"></a>'

    if text != None and text != '':
        return _urlfinderregex.sub(replacewithlink, text)
    else:
        return ''

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

1 голос
/ 13 ноября 2009
/\w+:\/\/[^\s]+/
0 голосов
/ 13 ноября 2009

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

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

0 голосов
/ 13 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...