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中使用base64模块来处理base64编码的方法
Jul 01 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 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 smarty 二级分类代码和模版循环例子
2011/06/16 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
javascript常用方法总结
2015/05/14 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
Python求离散序列导数的示例
2019/07/10 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
出纳的岗位职责
2013/11/09 职场文书
初二学习计划书范文
2014/04/27 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
办理信用卡工作证明
2014/09/30 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
会议欢迎词
2015/01/23 职场文书
劳资员岗位职责
2015/02/13 职场文书
董事长助理工作总结2015
2015/07/23 职场文书