Python中使用中文正则表达式匹配指定的中文字符串
生活随笔
收集整理的這篇文章主要介紹了
Python中使用中文正则表达式匹配指定的中文字符串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
業務場景:
從中文字句中匹配出指定的中文子字符串 .這樣的情況我在工作中遇到非常多, 特梳理總結如下.
難點:
處理GBK和utf8之類的字符編碼, 同時正則匹配Pattern中包含漢字,要漢字正常發揮作用,必須非常謹慎.推薦最好統一為utf8編碼,如果不是這種最優情況,也有酌情處理.
往往一個具有普適性的正則表達式會簡化程序和代碼的處理,使過程簡潔和事半功倍,這往往是高手和菜鳥最顯著的差別。
示例一:
從QQ純真數據庫中解析出省市縣等特定詞語,這里的正則表達式基本能夠滿足業務場景,懶惰匹配?非常必要,因為處理不好,會得不到我們想要的效果。個中妙處,還請各位看官自己琢磨,我這里只點到為止!
代碼如下:
#!/usr/bin/env python
#encoding: utf-8
#description: 從字符串中提取省市縣等名稱,用于從純真庫中解析解析地理數據import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')#匹配規則必須含有u,可以沒有r
#這里第一個分組的問號是懶惰匹配,必須這么做
PATTERN = \
ur'([\u4e00-\u9fa5]{2,5}?(?:省|自治區|市))([\u4e00-\u9fa5]{2,7}?(?:市|區|縣|州)){0,1}([\u4e00-\u9fa5]{2,7}?(?:市|區|縣)){0,1}'
data_list = ['北京市', '陜西省西安市雁塔區', '西班牙', '北京市海淀區', '黑龍江省佳木斯市湯原縣', '內蒙古自治區赤峰市',
'貴州省黔南州貴定縣', '新疆維吾爾自治區伊犁州奎屯市']for data in data_list:data_utf8 = data.decode('utf8')print data_utf8country = dataprovince = ''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
運行截圖
示例二:
從ip138中獲取指定ip的地理位置等信息。
ip138是我們日常使用較多的ip查詢網站,我為了獲取每個ip對應的isp信息,需要查詢這個頁面
我在網上搜索了很久,沒有找到ip138返回json之類的接口,只能以這種方式查詢,那么我們不可避免地需要解析出上圖中紅框標注的isp信息。如果使用DOM解析指定div標簽之類的常規思路恐怕不太湊效,更簡捷的方式是使用中文正則匹配,直接從返回的html中得到“本站主數據:”那部分的信息。
下面是我摸索的代碼
#!/usr/bin/env python
#encoding: utf-8
#date: 2016-03-31
#note: 測試中遇到的問題,請求指定的鏈接會有超時現象,可以多請求幾次import requests, re
import sys
reload(sys)
sys.setdefaultencoding('utf8')IP138_API = 'http://www.ip138.com/ips138.asp?ip='
PATTERN = ur'<li>本站主數據:(.*?)</li>'def query_api(url):data = ''r = requests.get(url)if r.status_code == 200:data = r.contentreturn datadef parse_ip138(html):#只能是unicode編碼,不能在后面再轉換為utf-8,否則無法正則匹配上.html = unicode(html, 'gb2312')#html = unicode(html, 'gb2312').encode('utf-8')#print htmlpattern = 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)
下面是截圖
總結
以上是生活随笔為你收集整理的Python中使用中文正则表达式匹配指定的中文字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UnicodeDecodeError:
- 下一篇: 在Ubuntu 14.04 64bit上