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中使用装饰器和元编程实现结构体类实例
Jan 28 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
Python作用域用法实例详解
Mar 15 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
python处理xml文件的方法小结
May 02 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Django框架首页和登录页分离操作示例
May 28 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
Python装饰器的练习题
Nov 23 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
对之前写的jquery分页做下升级
2014/06/19 Javascript
Javascript基础教程之数组 array
2015/01/18 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
python字典多条件排序方法实例
2014/06/30 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
django 类视图的使用方法详解
2019/07/24 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
python如何实现递归转非递归
2021/02/25 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
企业安全生产规章制度
2015/08/06 职场文书
小学英语教学随笔
2015/08/14 职场文书
年终工作总结范文
2019/06/20 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android