什么是正则表达式[^\s]*?意思?

Liu*_*Hao -1 python regex

我开始学习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,bc.在这种情况下,你的角色类是否定使用插入符号(^)在开始-这颠倒它的意义,使其符合什么,但在它的字符.

  • \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.