我开始学习python spider在网上下载一些图片,我发现代码如下。我知道一些基本的正则表达式。
我知道\.jpg
表示.jpg
,|
表示or
。第一行[^\s]*?
的含义是什么?我想知道为什么使用\s
?
两个正则表达式之间的区别是什么?
http:[^\s]*?(\.jpg|\.png|\.gif)
http://.*?(\.jpg|\.png|\.gif)
答案 0 :(得分:13)
好的,为了回答你的第一个问题,我会打破[^\s]*?
。
方括号([]
)表示character class。字符类基本上意味着您希望在该位置,一次匹配类中的任何内容。 [abc]
将匹配字符串a
,b
和c
。在这种情况下,您的角色类在开头使用插入符号(^
)否定 - 这会颠倒其含义,使其与但中的所有字符匹配它
\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)
在这种情况下,它会匹配以http
和https
开头的网址,以及以jpg
的两种变体形式结尾的文件。