1

有人可以将此 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:] 可以替换为 [!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~],所以我试过这个:

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"Test www.example.com test") 的“unmatched group”错误。

4

2 回答 2

2

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

  • Python 没有[[:punct:]]字符组;我使用POSIX 正则表达式引用来扩展它。

  • 该表达式使用可选组;在开始时匹配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>?'
于 2013-07-10T10:25:24.710 回答
0

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

语法类似于:

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

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

于 2013-07-10T10:24:44.983 回答