Python使用中文正则表达式匹配指定中文字符串的方法示例


Posted in Python onJanuary 20, 2017

本文实例讲述了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_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

运行截图

Python使用中文正则表达式匹配指定中文字符串的方法示例

示例二:

从ip138中获取指定ip的地理位置等信息。

ip138是我们日常使用较多的ip查询网站,我为了获取每个ip对应的isp信息,需要查询这个页面

Python使用中文正则表达式匹配指定中文字符串的方法示例

我在网上搜索了很久,没有找到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.content
 return data
def parse_ip138(html):
 #只能是unicode编码,不能在后面再转换为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)

下面是截图

Python使用中文正则表达式匹配指定中文字符串的方法示例

Python 相关文章推荐
Python数据结构之Array用法实例
Oct 09 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
Python 高级专用类方法的实例详解
Sep 11 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
pymysql 开启调试模式的实现
Sep 24 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
Python排序函数的使用方法详解
Dec 11 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 Python
python 查找字符串是否存在实例详解
Jan 20 #Python
python django 访问静态文件出现404或500错误
Jan 20 #Python
python中实现迭代器(iterator)的方法示例
Jan 19 #Python
Python正则替换字符串函数re.sub用法示例
Jan 19 #Python
Python中二维列表如何获取子区域元素的组成
Jan 19 #Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 #Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 #Python
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
2016/05/18 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
jQuery ui 1.7更新小结
2009/08/15 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Python对wav文件的重采样实例
2020/02/25 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
安全生产实施方案
2014/02/23 职场文书
村干部承诺书
2014/03/28 职场文书
青年联谊会致辞
2015/07/31 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
php解析非标准json、非规范json的方式实例
2022/05/10 PHP