有人可以将这个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”)。
答案 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)