此代码如何使用正则表达式从字符串中提取 URL's

How does this code work to extract URL's from a string with regex

我正在使用我在 stackexchange 上找到的片段,它使用 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 末尾的随机字符串是如何工作的?

提前致谢:)

使用这个 link 你可以得到你的正则表达式的解释: Your regex explained

再补充一点:

[s]? 表示 "an optional 's' character" 但那是因为 ? 而不是括号 [我认为它们是多余的。

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

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

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