我正在使用我在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]
在方括号中?)但我对{{{}之后的所有内容都不太确定1}}。我认为方括号中的东西例如。 (?:[etc etc etc]))+
是指从a到z的所有字母是否包含,但其余的东西呢?它是如何工作的只是在URL的末尾获取url而不是随机字符串?
提前致谢:)
答案 0 :(得分:0)
使用此链接可以解释您的正则表达式: Your regex explained
再添加一点:
[s]?
表示"一个可选的'字符"但那是因为?
没有括号[我认为它们是多余的。
Space并不是其中一个被接受的角色,所以它确实会停在那里。同样适用于' /'。它不是字面上提到的,也不是字符范围$-_
的一部分(见http://www.asciitable.com/index/asciifull.gif)。
(?:%[0-9a-fA-F][0-9a-fA-F])
这匹配网址中的十六进制字符代码,例如' /' %2f 字符。
非捕获组意味着该组匹配,但结果匹配未存储在正则表达式返回值中,即在对字符串运行正则表达式后,无法提取字符串的匹配位。