從學習Python至今,發(fā)現(xiàn)很多時候是將Python作為一種工具。特別在文本處理方面,使用起來更是游刃有余。
說到文本處理,那么正則表達式必然是一個絕好的工具,它能將一些繁雜的字符搜索或者替換以非常簡潔的方式完成。
我們在處理文本的時候,或是查詢抓取,或是替換.
如果你想自己實現(xiàn)這樣的功能模塊,輸入某一個ip地址,得到這個ip地址所在地區(qū)的詳細信息.
然后你發(fā)現(xiàn)http://ip138.com 可以查出很詳細的數(shù)據(jù)
但是人家沒有提供api供外部調(diào)用,但是我們可以通過代碼模擬查詢?nèi)缓髮Y(jié)果進行抓取.
通過查看這個相應(yīng)頁面的源碼,我們可以發(fā)現(xiàn),結(jié)果是放在三個<li></li>中的
如果你了解正則表達式你可能會寫出
這里使用了前瞻:lookahead 后顧: lookbehind,這樣的好處就是匹配的結(jié)果中就不會包含html的li標簽了.
如果你對自己寫的正則表達式不是很自信的話,可以在一些在線或者本地的正則測試工具進行一些測試,以確保正確.
接下來的工作就是如果用Python實現(xiàn)這樣的功能,首先我們得將正則表達式表示出來:
Python中字符串前面加上前導r這個字符,代表這個字符串是R aw String(原始字符串),也就是說Python字符串本身不會對字符串中的字符進行轉(zhuǎn)義.這是因為正則表達式也有轉(zhuǎn)義字符之說,如果雙重轉(zhuǎn)義的話,易讀性很差.
這樣的串在Python中我們把它叫做"regular exPRession pattern"
如果我們對pattern進行編譯的話
我們便可以得到一個正則表達式對象regular expression object,通過這個對象我們可以進行相關(guān)操作.
比如
接下來就是查找了,假設(shè)我們的html結(jié)果已經(jīng)以html的格式存放在text中,那么通過
便可以取得所需的結(jié)果列表.
使用正則表達式進行替換非常的靈活.
比如之前我在閱讀Trac這個系統(tǒng)中wiki模塊的源代碼的時候,就發(fā)現(xiàn)其wiki語法的實現(xiàn)就是通過正則替換進行的.
在使用替換的時候會涉及到正則表達式中的Group分組的概念.
假設(shè)wiki語法中使用!表示轉(zhuǎn)義字符即感嘆號后面的功能性字符會原樣輸出,粗體的語法為
那么有正則表達式為
這里的?P<bold>是Python正則語法中的一部分,表示其后的group的名字為"bold"
下面是替換時的情景,其中sub函數(shù)的第一個參數(shù)是pattern,第二個參數(shù)可以是字符串也可以是函數(shù),如果是字符串的話,那么就是將目標匹配的結(jié)果替換成指定的結(jié)果,而如果是函數(shù),那么函數(shù)會接受一個match object的參數(shù),并返回替換后的字符串,第三個參數(shù)便是源字符串.
每當匹配到一個三單引號,replace函數(shù)便運行一次,可能這時候需要一個全局變量記錄當前的三單引號是開還是閉,以便添加相應(yīng)的標記.
在實際的trac wiki的實現(xiàn)的時候,便是這樣通過一些標記變量,來記錄某些語法標記的開閉,以決定replace函數(shù)的運行結(jié)果.
--------------------
寫的有點粗,改日補詳細.
新聞熱點
疑難解答