使用Python中的正则表达式将URL替换为链接

4

如何将一些文本转换为链接?在PHP中,我使用了以下代码片段,它对我的目的非常有效:

            $text = preg_replace("#(^|[\n ])(([\w]+?://[\w\#$%&~.\-;:=,?@\[\]+]*)(/[\w\#$%&~/.\-;:=,?@\[\]+]*)?)#is", "\\1<a href=\"\\2\" target=\"_blank\">\\3</a>", $text);
            $text = preg_replace("#(^|[\n ])(((www|ftp)\.[\w\#$%&~.\-;:=,?@\[\]+]*)(/[\w\#$%&~/.\-;:=,?@\[\]+]*)?)#is", "\\1<a href=\"http://\\2\" target=\"_blank\">\\3</a>", $text);

我在Python中尝试过,但无法使其工作。如果有人能将其翻译成Python,那就太好了 :)。


2
什么没有起作用?你得到了什么样的结果?你应该给我们一个关于你尝试过什么的提示。如果你提供一个起点,你很可能会得到更好的结果,特别是因为它表明你愿意为解决问题付出努力。 - Blair Conrad
2
如果您正在使用Django,则有“urlize”过滤器:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#urlize - Javier
在Javier的评论基础上,urlize源代码似乎是你想要的: http://code.djangoproject.com/browser/django/trunk/django/utils/html.py#L77 - hao
非常感谢,那个过滤器(尤其是urlizetrunc)真的很有趣。我应该提到我正在使用Django。 - user122750
1个回答

7

下面的代码是将其翻译为 Python 的简单方法。您应该确认它确实符合您想要的需求。欲了解更多信息,请参阅Python 正则表达式 HOWTO

import re

pat1 = re.compile(r"(^|[\n ])(([\w]+?://[\w\#$%&~.\-;:=,?@\[\]+]*)(/[\w\#$%&~/.\-;:=,?@\[\]+]*)?)", re.IGNORECASE | re.DOTALL)

pat2 = re.compile(r"#(^|[\n ])(((www|ftp)\.[\w\#$%&~.\-;:=,?@\[\]+]*)(/[\w\#$%&~/.\-;:=,?@\[\]+]*)?)", re.IGNORECASE | re.DOTALL)


urlstr = 'http://www.example.com/foo/bar.html'

urlstr = pat1.sub(r'\1<a href="\2" target="_blank">\3</a>', urlstr)
urlstr = pat2.sub(r'\1<a href="http:/\2" target="_blank">\3</a>', urlstr)

print urlstr

这是我这边的输出结果:
<a href="http://www.example.com/foo/bar.html" target="_blank">http://www.example.com</a>

1
就是这样,它可以工作了。我只需要删除那个井号符号 pat2 = re.compile(r"# <<---,并且在 urlstr = pat2.sub() 中,我使用了 http:// 而不仅仅是 http:/。看起来我之前尝试过,但我不知道那个 "re.IGNORECASE | re.DOTALL",也没有删除我的 PHP 表达式中的井号符号。 我知道我应该查看一些正则表达式书籍或手册,但在所有这些年里,我只需要正则表达式来完成这个“简单”的事情,所以我的动力真的很低。对此很抱歉,希望你不会杀了我 :)... - user122750
另外,我忘了提到,我是这样做的,而不是使用过滤器,因为这只显示链接中域名的名称给用户,而不是完整的URL,也不是缩短到特定字符数的URL。 - user122750

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接