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

时间:2016-09-09 01:28:44

标签: python regex

我开始学习python spider在网上下载一些图片,我发现代码如下。我知道一些基本的正则表达式。 我知道\.jpg表示.jpg|表示or。第一行[^\s]*?的含义是什么?我想知道为什么使用\s? 两个正则表达式之间的区别是什么?

http:[^\s]*?(\.jpg|\.png|\.gif)
http://.*?(\.jpg|\.png|\.gif)

1 个答案:

答案 0 :(得分:13)

好的,为了回答你的第一个问题,我会打破[^\s]*?

  • 方括号([])表示character class。字符类基本上意味着您希望在该位置,一次匹配类中的任何内容。 [abc]将匹配字符串abc。在这种情况下,您的角色类在开头使用插入符号(^否定 - 这会颠倒其含义,使其与中的所有字符匹配它

  • \s相当简单 - 它是许多正则表达式中常见的速记,用于"任何空格字符"。这包括空格,制表符和换行符。

  • *?有点难以解释。 * quantifier非常简单 - 它意味着"匹配此标记(在这种情况下为字符类)零次或多次"。 ?应用于量词时,会使其 lazy - 它会尽可能少地匹配,一次从左到右一个字符。

在这种情况下,整个模式片段[^\s]*?的含义是"匹配任何非空白字符序列,包括空字符串"。正如评论中所提到的,这可以更简洁地写成\S*?

要回答问题的第二部分,我会比较你给出的两个正则表达式:

http:[^\s]*?(\.jpg|\.png|\.gif)
http://.*?(\.jpg|\.png|\.gif)

它们都以相同的方式启动:尝试匹配URL开头的协议和后续的冒号(:)字符。然后第一个匹配任何不包含任何空格的字符串,并以指定的文件扩展名结束。同时,第二个匹配两个字面斜杠字符(/),然后匹配任何字符序列,后跟有效的扩展名。

现在,显而易见的是,这两种模式都与URL匹配,但两者都不正确。例如,第一个模式将匹配像

这样的字符串
http:foo.bar.png
http:.png

两者都无效。同样,第二种模式将允许空格,允许这样的东西:

http:// .jpg
http://foo bar.png

在有效的网址中,这同样是非法的。一个更好的正则表达式(虽然我强烈反对尝试匹配正则表达式的URL)可能看起来像:

https?://\S+\.(jpe?g|png|gif)

在这种情况下,它会匹配以httphttps开头的网址,以及以jpg的两种变体形式结尾的文件。