我开始学习python spider在网上下载一些图片,我发现代码如下.我知道一些基本的正则表达式.我知道\.jpg手段.jpg和|手段or.[^\s]*?第一行的含义是什么?我想知道为什么要使用\s?两个正则表达式之间有什么区别?
http:[^\s]*?(\.jpg|\.png|\.gif)
http://.*?(\.jpg|\.png|\.gif)
Run Code Online (Sandbox Code Playgroud)
Seb*_*icz 14
好吧,所以回答你的第一个问题,我会崩溃[^\s]*?.
方括号([])表示一个字符类.字符类基本上意味着您希望在该位置,一次匹配类中的任何内容.[abc]将匹配的字符串a,b和c.在这种情况下,你的角色类是否定使用插入符号(^)在开始-这颠倒它的意义,使其符合什么,但在它的字符.
\s相当简单 - 它是许多正则表达式中用于"任何空白字符"的常用速记.这包括空格,制表符和换行符.
*?有点难以解释.该* 量词是相当简单-它的意思是"匹配此令牌(在这种情况下,字符类),零次或多次".的?,当应用到量词,使得懒惰 -它会少,因为它可以从左要在一次正确的字符相匹配.
在这种情况下,整个模式片段的[^\s]*?含义是"匹配任何非空白字符序列,包括空字符串".正如评论中所提到的,这可以更简洁地写成\S*?.
要回答你问题的第二部分,我会比较你给出的两个正则表达式:
http:[^\s]*?(\.jpg|\.png|\.gif)
http://.*?(\.jpg|\.png|\.gif)
Run Code Online (Sandbox Code Playgroud)
它们都以相同的方式启动:尝试匹配URL开头的协议和后续的冒号(:)字符.然后第一个匹配任何不包含任何空格的字符串,并以指定的文件扩展名结束.同时,第二个匹配两个文字斜杠字符(/),然后匹配任何字符序列,后跟有效的扩展名.
现在,很明显这两种模式都是为了匹配一个URL,但两者都是不正确的.例如,第一个模式将匹配字符串
http:foo.bar.png
http:.png
Run Code Online (Sandbox Code Playgroud)
两者都无效.同样,第二个模式将允许空格,允许这样的东西:
http:// .jpg
http://foo bar.png
Run Code Online (Sandbox Code Playgroud)
这在有效的URL中同样是非法的.一个更好的正则表达式(虽然我强烈反对尝试匹配正则表达式的URL)可能看起来像:
https?://\S+\.(jpe?g|png|gif)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它会匹配先从这两个URL http,并https在两者的变化结束,以及文件jpg.