用URL链接替换文本中的URL

hoj*_*oju 8 python regex url hyperlink

使用Python我希望将文本正文中的所有网址替换为指向这些网址的链接,就像Gmail所做的那样.这可以用一个班轮正则表达式来完成吗?

编辑:按文字正文我只是简单的文字 - 没有HTML

med*_*iev 11

您可以加载文档了一个DOM/HTML解析库(见html5lib),抓住所有文本节点,与它们匹配一个正则表达式,并使用一个PCRE如周围锚替换为正则表达式替换的URI的文本节点:

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

我很确定你可以匆匆找到并找到某种实用的功能,但我想不出任何偏离我的头脑.

编辑:尝试使用这里的答案:在格式化纯文本时如何让python-markdown另外"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)
Run Code Online (Sandbox Code Playgroud)

在字符串上调用urlify2,如果你不处理DOM对象,我认为就是这样.

  • 正则表达式应该是:`"([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_\\$\\.\\+\\!\\*\\ (\\),;:@&amp;=\\?/~\\#\\%]*[^]'\\.}&gt;\\),\\\"]"`,这个不能编译。 (2认同)

cri*_*aig 6

我经常狩猎,尝试了这些解决方案并且对它们的可读性或功能不满意,所以我推出了以下内容:

_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 ''
Run Code Online (Sandbox Code Playgroud)

你需要获得一个链接图像,但这很容易.这是专门为用户提交的文本,如评论,我认为通常是人们正在处理的.