国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Python之正則

2019-11-14 17:33:54
字體:
供稿:網(wǎng)友

從學習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>中的

Html代碼  收藏代碼
  1. <table width="80%"  border="0" align="center" cellpadding="0" cellspacing="0">  
  2.     <tr>  
  3.         <td align="center"><h3>ip138.com IP查詢(搜索IP地址的地理位置)</h3></td>  
  4.     </tr>  
  5.     <tr>  
  6.         <td align="center"><h1>您查詢的IP:121.0.29.231</h1></td>  
  7.     </tr>  
  8.     <tr>  
  9.   
  10.         <td align="center"><ul class="ul1"><li>本站主數(shù)據(jù):浙江省杭州市 阿里巴巴</li><li>參考數(shù)據(jù)一:浙江省杭州市 阿里巴巴</li><li>參考數(shù)據(jù)二:浙江省杭州市 阿里巴巴</li></ul></td>  
  11.     </tr>  
  12.     <tr>  
  13.         <td align="center">如果您發(fā)現(xiàn)查詢結(jié)果不詳細或不正確,請使用<href="ip_add.asp?ip=121.0.29.231"><font color="#006600"><b>IP數(shù)據(jù)庫自助添加</b></font></a>功能進行修正<br/><br/>  
  14.         <iframe src="/jss/bd_460x60.htm" frameborder="no" width="460" height="60" border="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></td>  
  15.   
  16.     </tr>  
  17.     <form method="get" action="ips8.asp" name="ipform" onsubmit="return checkIP();">  
  18.     <tr>  
  19.         <td align="center">IP地址或者域名:<input type="text" name="ip" size="16"<input type="submit" value="查詢"><input type="hidden" name="action" value="2"></td>  
  20.     </tr><br>  
  21. <br>  
  22.     </form>  
  23. </table>    

 

如果你了解正則表達式你可能會寫出

正則表達式
(?<=<li>).*?(?=</li>)

 

這里使用了前瞻:lookahead 后顧: lookbehind,這樣的好處就是匹配的結(jié)果中就不會包含html的li標簽了.

如果你對自己寫的正則表達式不是很自信的話,可以在一些在線或者本地的正則測試工具進行一些測試,以確保正確.

 

接下來的工作就是如果用Python實現(xiàn)這樣的功能,首先我們得將正則表達式表示出來:

 

Python代碼  收藏代碼
  1. r"(?<=<li>).*?(?=</li>)"  

 

 Python中字符串前面加上前導r這個字符,代表這個字符串是R aw String(原始字符串),也就是說Python字符串本身不會對字符串中的字符進行轉(zhuǎn)義.這是因為正則表達式也有轉(zhuǎn)義字符之說,如果雙重轉(zhuǎn)義的話,易讀性很差.

這樣的串在Python中我們把它叫做"regular exPRession pattern"

如果我們對pattern進行編譯的話

Python代碼  收藏代碼
  1. prog = re.compile(r"(?<=<li>).*?(?=</li>)")  

 

我們便可以得到一個正則表達式對象regular expression object,通過這個對象我們可以進行相關(guān)操作.

比如

Python代碼  收藏代碼
  1. result=prog.match(string)  
  2. ##這個等同于  
  3. result=re.match(r"(?<=<li>).*?(?=</li>)",string)  
  4. ##但是如果這個正則需要在程序匹配多次,那么通過正則表達式對象的方式效率會更高  

 

接下來就是查找了,假設(shè)我們的html結(jié)果已經(jīng)以html的格式存放在text中,那么通過

Python代碼  收藏代碼
  1. result_list = re.findall(r"(?<=<li>).*?(?=</li>)",text)  

 

便可以取得所需的結(jié)果列表.

 

 

二.替換

使用正則表達式進行替換非常的靈活.

比如之前我在閱讀Trac這個系統(tǒng)中wiki模塊的源代碼的時候,就發(fā)現(xiàn)其wiki語法的實現(xiàn)就是通過正則替換進行的.

在使用替換的時候會涉及到正則表達式中的Group分組的概念.

假設(shè)wiki語法中使用!表示轉(zhuǎn)義字符即感嘆號后面的功能性字符會原樣輸出,粗體的語法為

寫道
'''這里顯示為粗體'''

 那么有正則表達式為

Python代碼  收藏代碼
  1. r"(?P<bold>!?''')"  

  這里的?P<bold>是Python正則語法中的一部分,表示其后的group的名字為"bold"

  下面是替換時的情景,其中sub函數(shù)的第一個參數(shù)是pattern,第二個參數(shù)可以是字符串也可以是函數(shù),如果是字符串的話,那么就是將目標匹配的結(jié)果替換成指定的結(jié)果,而如果是函數(shù),那么函數(shù)會接受一個match object的參數(shù),并返回替換后的字符串,第三個參數(shù)便是源字符串.

Python代碼  收藏代碼
  1. result = re.sub(r"(?P<bold>!?''')", replace, line)  

 

每當匹配到一個三單引號,replace函數(shù)便運行一次,可能這時候需要一個全局變量記錄當前的三單引號是開還是閉,以便添加相應(yīng)的標記.

 

在實際的trac wiki的實現(xiàn)的時候,便是這樣通過一些標記變量,來記錄某些語法標記的開閉,以決定replace函數(shù)的運行結(jié)果.

 

--------------------

寫的有點粗,改日補詳細.


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 商河县| 长阳| 诸城市| 安阳县| 阿克| 镇江市| 长泰县| 乌拉特中旗| 岳阳市| 左贡县| 康平县| 长海县| 舟山市| 宝鸡市| 文安县| 葫芦岛市| 呼和浩特市| 达日县| 繁峙县| 称多县| 闽侯县| 睢宁县| 高清| 西吉县| 集贤县| 印江| 绿春县| 民和| 星子县| 乌鲁木齐市| 织金县| 东山县| 陈巴尔虎旗| 浙江省| 台安县| 荣昌县| 五常市| 海宁市| 登封市| 万年县| 萍乡市|