【问题标题】:How does this code work to extract URL's from a string with regex此代码如何使用正则表达式从字符串中提取 URL
【发布时间】:2015-03-13 21:27:21
【问题描述】:

我正在使用我在 stackexchange 上找到的 sn-p,它使用 re.findall() 查找字符串中的所有 url。它工作得很好,但是为了进一步了解我的知识,我想知道它是如何工作的。代码如下-

re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', site)

据我了解,它会查找以 http 或 https 开头的所有字符串(这就是为什么 [s] 在方括号中的原因?)但我不太确定 (?:[etc etc etc]))+ 之后的所有内容。我认为方括号中的内容,例如。 [a-zA-Z] 表示从 a 到 z 的所有字母是否大写,但其余的内容呢?在 url 末尾只获取 url 而不是随机字符串是如何工作的?

提前致谢:)

【问题讨论】:

  • 您可以将正则表达式插入regex101.com 以获得他们在做什么的纯文本解释。

标签: python regex python-3.x string-parsing findall


【解决方案1】:

使用此链接,您可以获得正则表达式的解释: Your regex explained

再补充一点:

[s]? 表示“可选的 's' 字符”,但这是因为 ? 不在括号内 [我认为它们是多余的。

空格不是可接受的字符之一,因此它确实会停在那里。 '/' 也一样。它不是字面上提到的,也不是字符范围$-_ 的一部分(参见http://www.asciitable.com/index/asciifull.gif)。

(?:%[0-9a-fA-F][0-9a-fA-F]) 这匹配 URL 中的十六进制字符代码,例如%2f 表示“/”字符。

非捕获组意味着该组已匹配,但结果匹配未存储在正则表达式返回值中,即在正则表达式针对您的字符串运行后,您无法提取字符串的匹配位。

【讨论】:

  • 哦,太好了,这是一个很酷的链接,谢谢!我现在明白了很多,但是仍然有点不确定它是如何知道它的 URL 的结尾的 - 是不是因为 url 的末尾有一个空格并且正则表达式没有搜索空格所以它就停止了?还有 (?: 是我发现的一个非捕获组 - 这到底是什么意思?
猜你喜欢
  • 2013-07-29
  • 2015-03-10
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2017-05-12
  • 2019-05-26
相关资源
最近更新 更多