用URL链接替换文本中的URL

时间:2009-11-13 06:39:28

标签: python regex url hyperlink

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

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

5 个答案:

答案 0 :(得分:10)

您可以使用DOM / HTML解析库(请参阅html5lib)加载文档,获取所有文本节点,将它们与正则表达式匹配,并使用带有锚点的URI的正则表达式替换文本节点,使用PCRE如:

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

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

修改:尝试使用此处的答案:How do I get python-markdown to additionally "urlify" links when formatting plain text?

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对象,我认为就是这样。

答案 1 :(得分: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 ''

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

当您说“文本正文”是指纯文本文件还是HTML文档中的正文文本?如果您想要HTML文档,则需要使用Beautiful Soup来解析它;然后,搜索正文并插入标签。

最好使用urlparse模块匹配实际的网址。在此完整讨论: How do you validate a URL with a regular expression in Python?

答案 4 :(得分:0)

对于网址而言,Gmail更加开放,但它并不总是正确的。例如它会将www.a.b变成超链接以及http://a.b,但由于包装文本和不常见(但有效)的URL字符,它经常会失败。

请参阅appendix A. A. Collected BNF for URI for syntax,并使用它来构建一个合理的正则表达式,该表达式也将考虑围绕URL的内容。建议您考虑一些URL最终会出现的情况。