Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
本文實(shí)例講述了Python使用中文正則表達(dá)式匹配指定中文字符串的方法。分享給大家供大家參考,具體如下:
業(yè)務(wù)場景:
從中文字句中匹配出指定的中文子字符串 .這樣的情況我在工作中遇到非常多, 特梳理總結(jié)如下.
難點(diǎn):
處理GBK和utf8之類的字符編碼, 同時正則匹配Pattern中包含漢字,要漢字正常發(fā)揮作用,必須非常謹(jǐn)慎.推薦最好統(tǒng)一為utf8編碼,如果不是這種最優(yōu)情況,也有酌情處理.
往往一個具有普適性的正則表達(dá)式會簡化程序和代碼的處理,使過程簡潔和事半功倍,這往往是高手和菜鳥最顯著的差別。
示例一:
從QQ純真數(shù)據(jù)庫中解析出省市縣等特定詞語,這里的正則表達(dá)式基本能夠滿足業(yè)務(wù)場景,懶惰匹配?非常必要,因?yàn)樘幚聿缓茫瑫貌坏轿覀兿胍男Ч?。個中妙處,還請各位看官自己琢磨,我這里只點(diǎn)到為止!
代碼如下:
#!/usr/bin/env python #encoding: utf-8 #description: 從字符串中提取省市縣等名稱,用于從純真庫中解析解析地理數(shù)據(jù) import re import sys reload(sys) sys.setdefaultencoding('utf8') #匹配規(guī)則必須含有u,可以沒有r #這里第一個分組的問號是懶惰匹配,必須這么做 PATTERN = \ ur'([\u4e00-\u9fa5]{2,5}?(?:省|自治區(qū)|市))([\u4e00-\u9fa5]{2,7}?(?:市|區(qū)|縣|州)){0,1}([\u4e00-\u9fa5]{2,7}?(?:市|區(qū)|縣)){0,1}' data_list = ['北京市', '陜西省西安市雁塔區(qū)', '西班牙', '北京市海淀區(qū)', '黑龍江省佳木斯市湯原縣', '內(nèi)蒙古自治區(qū)赤峰市', '貴州省黔南州貴定縣', '新疆維吾爾自治區(qū)伊犁州奎屯市'] for data in data_list: data_utf8 = data.decode('utf8') print data_utf8 country = data province = '' city = '' district = '' #pattern = re.compile(PATTERN3) pattern = re.compile(PATTERN) m = pattern.search(data_utf8) if not m: print country + '|||' continue #print m.group() country = '中國' if m.lastindex >= 1: province = m.group(1) if m.lastindex >= 2: city = m.group(2) if m.lastindex >= 3: district = m.group(3) out = '%s|%s|%s|%s' %(country, province, city, district) print out
運(yùn)行截圖
示例二:
從ip138中獲取指定ip的地理位置等信息。
ip138是我們?nèi)粘J褂幂^多的ip查詢網(wǎng)站,我為了獲取每個ip對應(yīng)的isp信息,需要查詢這個頁面
我在網(wǎng)上搜索了很久,沒有找到ip138返回json之類的接口,只能以這種方式查詢,那么我們不可避免地需要解析出上圖中紅框標(biāo)注的isp信息。如果使用DOM解析指定div標(biāo)簽之類的常規(guī)思路恐怕不太湊效,更簡捷的方式是使用中文正則匹配,直接從返回的html中得到“本站主數(shù)據(jù):”那部分的信息。
下面是我摸索的代碼
#!/usr/bin/env python #encoding: utf-8 #date: 2016-03-31 #note: 測試中遇到的問題,請求指定的鏈接會有超時現(xiàn)象,可以多請求幾次 import requests, re import sys reload(sys) sys.setdefaultencoding('utf8') IP138_API = 'http://www.ip138.com/ips138.asp?ip=' PATTERN = ur'<li>本站主數(shù)據(jù):(.*?)</li>' def query_api(url): data = '' r = requests.get(url) if r.status_code == 200: data = r.content return data def parse_ip138(html): #只能是unicode編碼,不能在后面再轉(zhuǎn)換為utf-8,否則無法正則匹配上. html = unicode(html, 'gb2312') #html = unicode(html, 'gb2312').encode('utf-8') #print html pattern = re.compile(PATTERN) m = pattern.search(html) if m: print m.group(1) else: print 'regex match failed' if __name__ == '__main__': url = IP138_API + '14.192.60.0' resp = query_api(url) if not resp: print 'no content' parse_ip138(resp)
下面是截圖
PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:
JavaScript正則表達(dá)式在線測試工具:
http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
pytest-sugar?執(zhí)行過程中顯示進(jìn)度條的腳本分享
Pytest-sugar是一款用來改善控制臺顯示的插件,增加了進(jìn)度條顯示,使得在用例執(zhí)行過程中可以看到進(jìn)度條,而且進(jìn)度條是根據(jù)用例是否通過標(biāo)注不同顏色,非常醒目,接下來通過本文給大家分享下pytest?sugar?顯示進(jìn)度條的腳本,感興趣的朋友一起看看吧2022-12-12Python中優(yōu)雅處理JSON文件的方法實(shí)例
JSON是一種輕量級的數(shù)據(jù)交換格式,JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣,這篇文章主要給大家介紹了關(guān)于Python中優(yōu)雅處理JSON文件的相關(guān)資料,需要的朋友可以參考下2021-12-12Python IDLE 錯誤:IDLE''''s subprocess didn''''t make connectio
這篇文章主要介紹了Python IDLE 錯誤:IDLE's subprocess didn't make connection 的解決方案的相關(guān)資料,需要的朋友可以參考下2017-02-02python簡單線程和協(xié)程學(xué)習(xí)心得(分享)
下面小編就為大家?guī)硪黄猵ython簡單線程和協(xié)程學(xué)習(xí)心得(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06【Python】Python的urllib模塊、urllib2模塊批量進(jìn)行網(wǎng)頁下載文件
這篇文章主要介紹了Python的urllib模塊、urllib2模塊批量進(jìn)行網(wǎng)頁下載文件,就是一個簡單的從網(wǎng)頁抓取數(shù)據(jù)、下載文件的小程序,需要的可以了解一下。2016-11-11