Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
本文實例講述了Python使用中文正則表達(dá)式匹配指定中文字符串的方法。分享給大家供大家參考,具體如下:
業(yè)務(wù)場景:
從中文字句中匹配出指定的中文子字符串 .這樣的情況我在工作中遇到非常多, 特梳理總結(jié)如下.
難點:
處理GBK和utf8之類的字符編碼, 同時正則匹配Pattern中包含漢字,要漢字正常發(fā)揮作用,必須非常謹(jǐn)慎.推薦最好統(tǒng)一為utf8編碼,如果不是這種最優(yōu)情況,也有酌情處理.
往往一個具有普適性的正則表達(dá)式會簡化程序和代碼的處理,使過程簡潔和事半功倍,這往往是高手和菜鳥最顯著的差別。
示例一:
從QQ純真數(shù)據(jù)庫中解析出省市縣等特定詞語,這里的正則表達(dá)式基本能夠滿足業(yè)務(wù)場景,懶惰匹配?非常必要,因為處理不好,會得不到我們想要的效果。個中妙處,還請各位看官自己琢磨,我這里只點到為止!
代碼如下:
#!/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è)計有所幫助。
相關(guān)文章
Python?設(shè)計模式中的創(chuàng)建型建造者模式
本文介紹Python設(shè)計模式中的創(chuàng)建型建造者模式,其表現(xiàn)為復(fù)雜對象的創(chuàng)建與表現(xiàn)相分離,這樣,同一個過程就有不同的表現(xiàn),想要創(chuàng)建一個由多個部分組成的對象,而且它的構(gòu)成需要一步接一步的完成。只有當(dāng)各個部分都完成了,這個對象才完整,下文相關(guān)自來哦,需要的朋友可以參考下2022-02-02
Tensorflow讀取并輸出已保存模型的權(quán)重數(shù)值方式
今天小編就為大家分享一篇Tensorflow讀取并輸出已保存模型的權(quán)重數(shù)值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看不看2020-01-01
Python import與from import使用和區(qū)別解讀
Python程序可以調(diào)用一組基本的函數(shù)(即內(nèi)建函數(shù)),比如print()、input()和len()等函數(shù)。接下來通過本文給大家介紹Python import與from import使用及區(qū)別介紹,感興趣的朋友一起看看吧2021-09-09
Python實現(xiàn)多維數(shù)據(jù)分析的示例詳解
多維數(shù)據(jù)分析是對數(shù)據(jù)的信息分析,它考慮了許多關(guān)系,這篇文章主要為大家詳細(xì)介紹了一些使用Python分析多維/多變量數(shù)據(jù)的基本技術(shù),希望對大家有所幫助2023-11-11
python實現(xiàn)socket+threading處理多連接的方法
今天小編就為大家分享一篇python實現(xiàn)socket+threading處理多連接的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python matplotlib坐標(biāo)軸設(shè)置的方法
本篇文章主要介紹了python matplotlib坐標(biāo)軸設(shè)置的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

