1. 程式人生 > >教女朋友學Python(7)——找啊找啊找朋友

教女朋友學Python(7)——找啊找啊找朋友

程式設計是一門要動手的學問,我在必要的地方用動態截圖是可以保證閱讀的完整性,但是那僅僅是我敲的程式碼。

上一期我們從網址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......],這種資料,已經不屬於我們說的五種基本資料型別了,他是什麼呢?下節課繼續。

歡迎關注我的微信公眾號獲取最新文章: