【问题标题】:Gruber’s URL Regular Expression in PythonPython 中 Gruber 的 URL 正则表达式
【发布时间】:2010-12-31 11:01:49
【问题描述】:

如何重写这个new way to recognise 地址以在 Python 中工作?

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

【问题讨论】:

标签: python regex gruber


【解决方案1】:

original source 表示“这种模式应该适用于大多数现代正则表达式实现”,特别是 Perl。 Python 的正则表达式实现是现代的,similar to Perl's,但缺少[: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() 调用转义字符集as required 中的某些字符。

编辑:使用 re.escape() 也同样有效,因为它只是在 everything 前面加上一个反斜杠。起初我觉得这很粗鲁,但在这种情况下确实很好用。

>>> pat = pat % re.escape(string.punctuation)

【讨论】:

  • 这通过了 Gruber 的所有测试,pat = pat % re.escape(string.punctuation)
  • @vanity,已更新以提及这一点。请注意,如果您的数据源是 Unicode,那么像 string.punctuation 这样的纯 ASCII 解决方案可能会给出不完美的结果。
  • 它适用于非 ASCII 域和路径。我没有非英语标点符号的测试数据。
【解决方案2】:

Python 没有 POSIX bracket expressions

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

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

【讨论】:

  • 确保在使用时使用“原始”字符串(前缀为r),否则反斜杠转义将不正确。
  • 另请注意,Python 不支持那些 Unicode 字符属性:stackoverflow.com/questions/1832893
  • 确实,它们编译得很好,但没有达到你的预期
  • Python 的正则表达式引擎是一个非常奇怪的野兽。修正了答案。
【解决方案3】:

我认为python没有这种表达方式

[:punct:]

Wikipedia 表示[:punct:]

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

【讨论】:

猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2015-09-14
  • 2021-12-31
  • 2013-08-21
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多