作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以将此 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")的“不匹配的组”错误。
最佳答案
该表达式使用了一些在 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>?'
关于Python 正则表达式用链接替换文本中的 URL(从 PHP 转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17568168/
我是一名优秀的程序员,十分优秀!