Python正则表达式用链接替换文本中的URL(从PHP转换)

时间:2013-07-10 10:21:40

标签: python regex

有人可以将这个PHP正则表达式转换为Python吗?我试了好几次却没有成功:

function convertLinks($text) {
    return preg_replace("/(?:(http:\/\/)|(www\.))(\S+\b\/?)([[:punct:]]*)(\s|$)/i",
    "<a href=\"http://$2$3\" rel=\"nofollow\">$1$2$3</a>$4$5", $text);
}

编辑: 我发现[:punct:]可以替换为[!“#$%&amp;'()* +, - 。/:;&lt; =&gt;?@ [\ _] ^ _` {|}〜],所以我试过了:

def convertLinks(text):
    pat = re.compile(ur"""(?:(http://)|(www\.))(\S+\b\/?)([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]*)(\s|$)""", re.IGNORECASE)
    return pat.sub(ur'<a href=\"http://\2\3" rel=\"nofollow\">\1\2\3</a>\4\5', text)

但我收到了convertLinks的“无法匹配的组”错误(u“测试www.example.com test”)。

2 个答案:

答案 0 :(得分:2)

该表达式使用了一些在Python中工作方式不同的功能。

  • Python没有[[:punct:]]个字符组;我使用POSIX regex reference来展开它。

  • 表达式使用可选组;在开始时匹配http:// www.,但在替换时使用两者。这将在Python中失败。解决方案:使用替换功能。

为了获得相同的功能,您可以使用:

import re

_link = re.compile(r'(?:(http://)|(www\.))(\S+\b/?)([!"#$%&\'()*+,\-./:;<=>?@[\\\]^_`{|}~]*)(\s|$)', re.I)

def convertLinks(text): 
    def replace(match):
        groups = match.groups()
        protocol = groups[0] or ''  # may be None
        www_lead = groups[1] or ''  # may be None
        return '<a href="http://{1}{2}" rel="nofollow">{0}{1}{2}</a>{3}{4}'.format(
            protocol, www_lead, *groups[2:])
    return _link.sub(replace, text)

演示:

>>> test = 'Some text with www.stackoverflow.com links in them like http://this.too/with/path?'
>>> convertLinks(test)
'Some text with <a href="http://www.stackoverflow.com" rel="nofollow">www.stackoverflow.com</a> links in them like <a href="http://this.too/with/path" rel="nofollow">http://this.too/with/path</a>?'

答案 1 :(得分:0)

如果你想在python中使用正则表达式,你应该考虑使用re模块。在此示例中,特别是re.sub

语法类似于:

output = re.sub(regular_expression, what_it_should_be_replaced_by, input)

不要忘记re.sub()会返回替换字符串。