5

如何重写这种识别地址的新方法以在 Python 中工作?

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

4

3 回答 3

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() 也可以,因为它只是在Everything前面加上一个反斜杠。起初我觉得这很粗糙,但在这种情况下肯定很好用。

>>> pat = pat % re.escape(string.punctuation)
于 2009-12-31T16:55:42.523 回答
5

我不认为python有这个表达

[:punct:]

维基百科[:punct:]是一样的

[-!\"#$%&\'()*+,./:;<=>?@\\[\\\\]^_`{|}~]
于 2009-12-31T16:48:20.117 回答
2

Python 没有POSIX 括号表达式

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

[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~] 
于 2009-12-31T16:52:43.867 回答