re_qb = re.compile(r'detail.*?<a.*?>(.*?)<.*?title="(.*?)">\s*(.*?)\s*?<',re.DOTALL)
http://www.oschina.net/code/snippet_143473_24609 命令行看糗百里的.请详细解释一下每一部分的含义.
re_qb = re.compile(r'detail.*?<a.*?>(.*?)<.*?title="(.*?)">\s*(.*?)\s*?<',re.DOTALL)
http://www.oschina.net/code/snippet_143473_24609 命令行看糗百里的.请详细解释一下每一部分的含义.
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
其实这个和python没多大关系,主要是正则表达式。
re.compile()是将字符串书写的正则表达式转换成模式对象,以便后面进行匹配。其中,r''里面的内容是字符串
'.'表示通配符,可以匹配除了换行符以外的任意一个字符,但是加上
re.DOTALL
之后'.'就可以匹配到换行符了。然后逐个来解释,其中,
detail
,<
,a
,>
,title="
等等不是特殊字符的,直接匹配.表示通配,允许重复0次或多次,所以.可以匹配任意多个字符,也可以匹配0个字符。?表示非贪婪模式,如果不加问号直接写成
detail.*<a
这样会从detail开始匹配,一直匹配到最后一个<a
处,而我们想要的是从detail开始匹配到第一次出现<a
为止,所以就要用非贪婪模式。这就是问号的作用。<a.*?>
同理,从<a
开始匹配,到第一个>
为止的任意字符。括号()表示子模式,此处理解为括号内就是要找出来的内容即可。
最后就是
\s
匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。命令行看糗百写的不是很好,分割不清楚,带有图片的应该过虑掉不显示。
最开始分析的时候可以它匹配的糗百的页面找到源码,然后用正则表达式在线测试,高亮显示匹配结果,一点一点的测试,比较容易明白。