业务场景

从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下.

难点:

处理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中使用中文正则表达式匹配指定的中文字符串相关推荐

  1. 在python中,用正则表达式提取多层括号中最外层括号包含的内容

    提取多层括号中最外层括号包含的内容有几种方式,那么用正则表达式该怎么实现呢? 在python中,用正则表达式提取多层括号中最外层括号包含的内容 比如有一个字符串 : 学习python中有什么不懂的地方 ...

  2. python 正则表达式 前瞻_我应该如何在python中编写这个正则表达式(How should I write this regex in python)...

    我应该如何在python中编写这个正则表达式(How should I write this regex in python) 我有字符串. st = "12345 hai how r u ...

  3. 正则表达式匹配指定的tr标签

    问题来源 利用正则表达式匹配指定的<tr></tr>,在这个tr标签中存在一个特殊的字符串"[$]",要在多个tr标签中匹配出所有符合条件的<tr&g ...

  4. java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字

    在java中怎么利用正则表达式匹配数字 发布时间:2020-12-03 17:47:12 来源:亿速云 阅读:58 作者:Leah 在java中怎么利用正则表达式匹配数字?针对这个问题,这篇文章详细介 ...

  5. linux 匹配 中文开头,中文正则表达式匹配问题之正则表达式中文匹配使用方法,...

    中文正则表达式匹配问题之正则表达式中文匹配使用方法, 这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的. \w匹配 ...

  6. java正则表达式获取指定两个字符串之间内容

    xml解析利用正则表达式获取指定两个字符串之间内容 在遇到解析复杂xml的时候,想到大家所想到的都是利用dom4j作为首发工具,但是当遇到层次很多,较为复杂,我们难道还需要从根节点一层一层的解析下去吗 ...

  7. 正则表达式匹配不包含特定字符串解决匹配溢出问题

    匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题. 那么,什么是匹配溢出呢? 下面我们来看个例子: ...

  8. 正则表达式匹配不包含某些字符串的技巧

    这篇文章主要介绍了正则表达式匹配不包含某些字符串的技巧,详细分解了应该怎么做和这么做的原因,需要的朋友可以参考下 经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^ ...

  9. 正则表达式匹配“不包含某些字符串”的技巧

    这篇文章主要介绍了正则表达式匹配不包含某些字符串的技巧,详细分解了应该怎么做和这么做的原因,需要的朋友可以参考下 经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^ ...

最新文章

  1. DataBase 之 拉链表结构设计
  2. 如何写优雅的SQL原生语句?
  3. 微信XML,Object,MAP相互转换
  4. leetcode 1310. 子数组异或查询(位运算)
  5. redis-数据类型-有序集合
  6. CentOS 7下mysqld服务启动失败终极解决方案
  7. 朝鲜黑掉韩国政府版 Word
  8. matlab 常用函数或符号用法总结
  9. 中国专利电子申请网CPC客户端的安装教程
  10. ArcGIS土地利用转移矩阵(附土地利用数据下载)
  11. 大数据之spark_spark SQL的建表语句
  12. win10没有自带计算机,Win10没有自带游戏怎么办 Win10找回自带游戏方法
  13. 硬件笔记1:80508550三极管对管驱动电机电路(已经实测可用)
  14. php mac开启socket,mac上nginx以socket的方式连接php-fpm出现502错误?
  15. java怎么实现简体繁体切换_java代码实现简体繁体转换
  16. 为知笔记——使用第三方Markdown的Typora编辑器编辑为知笔记
  17. java+SpringBoot+HTML+Mysq基于微信小程序的大咖读书系统的设计与实现
  18. Android 高级开发 JNI NDK 介绍与使用
  19. JVM2:垃圾收集器与内存分配策略
  20. CAD转JPG图片,在线转换成高质量彩色图片

热门文章

  1. 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
  2. 机器学习入门(09)— 偏导数、梯度概念、梯度下降法理论和实现
  3. Python 列表和迭代器区别
  4. Python学习日志9月14日
  5. ubuntu下安装 python 常用软件
  6. ubuntu14.04安装hadoop2.6.0(伪分布模式)
  7. 【转】创建不可见的Activity
  8. WCF配置文件全攻略
  9. pacman 查询_pacman包管理常用命令
  10. 最小径集的算法_机器学习的利器——集成算法