上一期我们从网址http://cn.bing.com/images/search?q=胡歌&first=1&count=28获取到了数据,并把他解码成了字符串,他是一团乱麻。
第三期中,我们说过,要从中找出这样的:<a class="thumb" target="_blank" href="第一串网址" h="ID=images,5028.1"><div class="cico" style="width:230px;height:170px;"><img src="第二串网址" alt=" " width="230" height="170"></div></a>,然后从里面拿到第一串网址的部分。我的天,天书一样的字符串里怎么找出几段这样东西呢。还好早期的程序员们发明了一种叫正则表达式的东西,不然,那就真是我的天了。正则表达式是什么呢?简单来说,是一种描述性的语言,来描述字符串的特征。如果一段字符串,完全或者部分的符合这段描述语言,就认为“匹配”,否则就不匹配。打个比方,我的待匹配人物有:林黛玉、薛宝钗、贾元春、贾探春、史湘云、妙玉、贾迎春、贾惜春、王熙凤、贾巧姐、李纨、秦可卿;描述语句:一双丹凤三角眼,两弯柳叶吊梢眉,身量苗条,体格风骚,粉面含春威不露,丹唇未启笑先闻。那能匹配到谁?当然是王熙凤。那如果只用其中的身量苗条呢?是不是就有好多人都可以匹配了。如果描述语句改成:卷脏莲蓬吊搭嘴,耳如蒲扇显金睛,獠牙锋利如钢锉,长嘴张开似火盆,哈哈,还有能匹配上的么?正则表达式也是这样,我们用一定的规则,描述一个字符串的特征,然后和待匹配的字符串运算,看是否有能匹配上的。至于正则表达式深入用法,是可以写本书的,在这里我简单说一下他们的类别,还有每个类别里面我们会用到的。1、如果要描述一串字符串,最精确的是不是字符串本身?比如我的描述语言是王熙凤,那匹配的当然有且只有王熙凤。所以这种,就是普通的字符串,匹配他们本身。这是一个在线的正则表达式测试工具,网址:http://tool.oschina.net/regex/。上面是待匹配字符串,中间是正则表达式,下面是匹配结果。2、有了普通就有特殊的,比如,匹配数字用/d,还有我们要用到的这个奇葩:.,嗯没错,就是一个点,匹配除了换行符号/n之外的所有字符。那么请问?我要匹配符号.的时候怎么办呢?还记得我们用引号表示字符串时,如果字符串里有引号,怎么办么?一样的办法。3、在第一个例子中看到,我们想匹配“妈妈”,非得完整的输入“妈妈”才行,只输入“妈”就只能分开匹配。两个字还好,我们输入“妈妈”也没什么。可是,如果在第二个例子中,我想用.一次性匹配一整句话的16个字,难道要输入16个点么?这也太蠢了。于是就有了描述匹配数量的方法:.{16},就是表示匹配16分符合.这个描述的字符,如果是{16,20}就是匹配16到20个,如果是{16,},表示匹配16个以及16个以上。现在来说一个我们要用到的特殊的:+,加号,匹配一次或多次,也就是等同于{1,}:哎,不想写了,正则表达式这东西吧,得去记,我并不能用抽象的表述让他变得更有趣或者更好理解,我说得再多,也不如自己去记。不说了,我直接把代码贴出来得了:
reg = r'<a class="thumb" target="_blank" href="(.+?)"'imgre = re.compile(reg)imglist = imgre.findall(html)第一句是定义一个正则表达式,开头的一个r,就是表示正则表达式(Regular ExPRession,简写regex)。第二句re.compile(),re是python内建模块,需要用import re导入。compile方法用于编译一个正则表达式,形成一个过滤器,这个过滤器就是imgre。第三句findall就很容易理解了,用过滤器去找。那么找到的结果是怎样的呢?我打印的是imglist,看到了吗,结果就是我们需要的图片网址,正则表达式是不是很神奇,仅仅三行代码,就从那么复杂的数据中找到我们想要的,同学们快去好好的学正则表达式的规则吧。不过有同学发现没,我打印出来的imglist的格式是[url1,url2,url3,url4......],这种数据,已经不属于我们说的五种基本数据类型了,他是什么呢?下节课继续。
欢迎关注我的微信公众号获取最新文章:
新闻热点
疑难解答