2009-12-31 22 views
5

如何重写这个new way to recognise地址以在Python中工作?Gruber在Python中的正则表达式

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

+0

哪部分不工作? – 2009-12-31 16:45:02

+0

为什么你不把你的代码放在问题中,例如 – 2009-12-31 17:32:28

+0

@vanity失败,Unicode字符属性的答案将不起作用。请参阅http://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties – 2009-12-31 17:57:02

回答

12

original source为,指出具体的Perl“这图案应在最现代化的regex实现工作”。 Python的正则表达式的实现是现代的,并且similar to Perl's但缺少[:punct:]字符类。您可以轻松地构建,使用这样的:里面的字符集as required

>>> 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) 
+0

这通过了Gruber的所有测试,就像pat = pat%re.escape(string.punctuation) – Tobias 2009-12-31 18:04:03

+0

@vanity一样,更新了这一点。注意一点很明显,如果你的数据源是Unicode的话,像string.punctuation这样的纯ASCII解决方案可能会给出不完美的结果。 – 2009-12-31 18:11:15

+0

它适用于非ASCII域和路径。我没有非英文标点符号的测试数据。 – Tobias 2010-01-01 17:20:24

5

我不认为Python有这种表达

[:punct:] 

Wikipedia[:punct:]是相同的,以

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

维基百科错误。根据http://www.regular-expressions.info/posixbrackets.html,它错过了脱字符号。 – 2009-12-31 17:05:02

+0

好吧,现在是对的。请更新您的答案。 – 2009-12-31 17:07:28

+0

是的,更新了我的帖子,谢谢。有人更新了维基百科。大! – YOU 2009-12-31 17:09:46

2

Python不具备POSIX bracket expressions

[:punct:]括号表达式是在对应的ASCII码

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

确保在使用该字符串时使用“raw”字符串(前缀为“r”),否则反斜杠转义将不正确。 – 2009-12-31 17:10:33

+0

另外请注意,Python不支持这些Unicode字符属性:http://stackoverflow.com/questions/1832893 – 2009-12-31 17:56:31

+0

确实,它们编译得很好,但不会做你期望的东西 – Tobias 2009-12-31 18:00:08