上一期我們從網址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......],這種數據,已經不屬于我們說的五種基本數據類型了,他是什么呢?下節課繼續。
歡迎關注我的微信公眾號獲取最新文章:
|
新聞熱點
疑難解答