将文本中的URL替换为链接

8 投票
5 回答
11360 浏览
提问于 2025-04-15 15:58

我想用Python把一段文字里的所有网址替换成可以点击的链接,就像Gmail那样。请问这能用一行正则表达式实现吗?

补充说明:这里的文字指的是普通文本,不是HTML格式。

5 个回答

1

在编程中,有时候我们会遇到一些问题,想要找到解决方案。比如说,有人可能在使用某个工具或库时,遇到了错误或者不明白怎么用。这时候,大家会在一个叫做StackOverflow的网站上提问,寻求帮助。

在这个网站上,很多有经验的程序员会分享他们的知识和经验,帮助那些遇到困难的人。提问时,最好把问题描述清楚,提供一些相关的代码,这样别人才能更好地理解你的问题并给出建议。

总之,StackOverflow是一个很好的地方,可以让你找到编程上的帮助和灵感,尤其是当你卡住的时候。

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

我找了很多资料,试过一些解决方案,但它们的可读性和功能让我不太满意,所以我自己做了以下这个:

_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 ''

你需要获取一个链接的图片,这个其实很简单。这个主要是针对用户提交的文本,比如评论,我想这通常是大家会遇到的情况。

11

你可以使用一个解析HTML的库(比如html5lib)来加载文档,然后提取出所有的文本节点。接着,你可以用正则表达式来匹配这些文本,并用正则表达式的替换功能,把文本节点中的网址用锚点包裹起来,像这样:

/(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)

如果你处理的不是DOM对象,只需对一个字符串调用urlify2,我想就可以了。

撰写回答