Gruber的URL正则表达式在Python中的实现
我该如何把这个识别地址的新方法改写成可以在Python中使用的呢?
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
3 个回答
2
5
12
这个内容的原始来源提到:“这个模式在大多数现代正则表达式的实现中应该都能用”,特别是指Perl语言。Python的正则表达式实现也是现代的,并且和Perl的相似,但缺少了[:punct:]
这个字符类别。你可以很简单地用下面的方式来构建它:
>>> import string, re
>>> pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))'
>>> pat = pat % re.sub(r'([-\\\]])', r'\\\1', string.punctuation)
在这个re.sub()
调用中,会对字符集里的某些字符进行转义,这是必要的。
编辑:使用re.escape()也同样有效,因为它会在所有字符前面加一个反斜杠。起初我觉得这样做有点粗糙,但在这个情况下确实没问题。
>>> pat = pat % re.escape(string.punctuation)