Gruber的URL正则表达式在Python中的实现

5 投票
3 回答
2206 浏览
提问于 2025-04-15 17:31

我该如何把这个识别地址的新方法改写成可以在Python中使用的呢?

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))

3 个回答

2

Python不支持POSIX括号表达式

[:punct:]这个括号表达式在ASCII中是等价于

[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~] 
5

我觉得Python没有这个表达式。

[:punct:]

维基百科上说,[:punct:]和下面这个是一样的:

[-!\"#$%&\'()*+,./:;<=>?@\\[\\\\]^_`{|}~]
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)

撰写回答