业务场景

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

难点:

处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理.

往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别。

示例一:

从QQ纯真数据库中解析出省市县等特定词语,这里的正则表达式基本能够满足业务场景,懒惰匹配?非常必要,因为处理不好,会得不到我们想要的效果。个中妙处,还请各位看官自己琢磨,我这里只点到为止!

代码如下:

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. #description: 从字符串中提取省市县等名称,用于从纯真库中解析解析地理数据
  4. import re
  5. import sys
  6. reload(sys)
  7. sys.setdefaultencoding('utf8')
  8. #匹配规则必须含有u,可以没有r
  9. #这里第一个分组的问号是懒惰匹配,必须这么做
  10. PATTERN = \
  11. ur'([\u4e00-\u9fa5]{2,5}?(?:省|自治区|市))([\u4e00-\u9fa5]{2,7}?(?:市|区|县|州)){0,1}([\u4e00-\u9fa5]{2,7}?(?:市|区|县)){0,1}'
  12. data_list = ['北京市', '陕西省西安市雁塔区', '西班牙', '北京市海淀区', '黑龙江省佳木斯市汤原县', '内蒙古自治区赤峰市',
  13. '贵州省黔南州贵定县', '新疆维吾尔自治区伊犁州奎屯市']
  14. for data in data_list:
  15. data_utf8 = data.decode('utf8')
  16. print data_utf8
  17. country = data
  18. province = ''
  19. city = ''
  20. district = ''
  21. #pattern = re.compile(PATTERN3)
  22. pattern = re.compile(PATTERN)
  23. m = pattern.search(data_utf8)
  24. if not m:
  25. print country + '|||'
  26. continue
  27. #print m.group()
  28. country = '中国'
  29. if m.lastindex >= 1:
  30. province = m.group(1)
  31. if m.lastindex >= 2:
  32. city = m.group(2)
  33. if m.lastindex >= 3:
  34. district = m.group(3)
  35. out = '%s|%s|%s|%s' %(country, province, city, district)
  36. print out

运行截图

示例二

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

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

我在网上搜索了很久,没有找到ip138返回json之类的接口,只能以这种方式查询,那么我们不可避免地需要解析出上图中红框标注的isp信息。如果使用DOM解析指定div标签之类的常规思路恐怕不太凑效,更简捷的方式是使用中文正则匹配,直接从返回的html中得到“本站主数据:”那部分的信息。

下面是我摸索的代码

  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3. #date: 2016-03-31
  4. #note: 测试中遇到的问题,请求指定的链接会有超时现象,可以多请求几次
  5. import requests, re
  6. import sys
  7. reload(sys)
  8. sys.setdefaultencoding('utf8')
  9. IP138_API = 'http://www.ip138.com/ips138.asp?ip='
  10. PATTERN = ur'<li>本站主数据:(.*?)</li>'
  11. def query_api(url):
  12. data = ''
  13. r = requests.get(url)
  14. if r.status_code == 200:
  15. data = r.content
  16. return data
  17. def parse_ip138(html):
  18. #只能是unicode编码,不能在后面再转换为utf-8,否则无法正则匹配上.
  19. html = unicode(html, 'gb2312')
  20. #html = unicode(html, 'gb2312').encode('utf-8')
  21. #print html
  22. pattern = re.compile(PATTERN)
  23. m = pattern.search(html)
  24. if m:
  25. print m.group(1)
  26. else:
  27. print 'regex match failed'
  28. if __name__ == '__main__':
  29. url = IP138_API + '14.192.60.0'
  30. resp = query_api(url)
  31. if not resp:
  32. print 'no content'
  33. parse_ip138(resp)

下面是截图

版权声明:本文为博主原创文章,未经博主允许不得转载。

Python中使用中文正则表达式匹配指定的中文字符串的更多相关文章

  1. 第11.18节 Python 中re模块的匹配对象

    匹配对象是Python中re模块正则表达式匹配处理的返回结果,用于存放匹配的情况.老猿认为匹配对象更多的应该是与组匹配模式的功能对应的,只是没有使用组匹配模式的正则表达式整体作为组0. 为了说明下面的 ...

  2. C#中,使用正则表达式匹配获取所需数据

    .NET中,使用正则表达式匹配获取所需数据 需求:获取一串字符串中,正则匹配出需要的数据. 例如以下字符串: string temp ="ErrorCode:-1,Message:{&quo ...

  3. Python中re操作正则表达式

    在python中使用正则表达式 1.转义符 正则表达式中的转义: '\('表示匹配小括号 [()+*/?&.] 在字符组中一些特殊的字符会现出原形 所有的\s\d\w\S\D\W\n\t都表示 ...

  4. Python(2.7.6) glob - 匹配指定模式的文件

    Python 标准库的 glob 模块支持查询匹配指定模式的文件或目录.这里的模式使用的并不是正则表达式,而是通过通配符来匹配的 Unix 风格的路径名扩展. 支持的通配符: 通配符 说明 *  匹配 ...

  5. python中,有关正则表达式re函数:compile、match、search、findall

    1.全局匹配函数 re.compile(pattern=pattern,re.S).findall(text)函数: compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对 ...

  6. 『无为则无心』Python基础 — 8、Python中的数据类型(数值、布尔、字符串)

    目录 1.数据类型介绍 2.数值型(Number) 3.布尔型(bool) 4.None(空值) 5.常量 6.字符串(String) 1.数据类型介绍 (1)什么是数据类型 在生活中,我们日常使用的 ...

  7. Python中的列表、元组、字典、字符串及切片操作

    我们引入一个新的概念:数据结构 数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或字符,甚至可以是其他数据结构,在python中,最基本的数据结构是序列,序列中的每个元素匾被分 ...

  8. Python中常见的正则表达式符号

    ?  匹配零次或一次前面的分组 *   匹配零次或多次前面的分组 +  匹配一次或多次前面的分组 {n} 匹配n次前面的分组 {n,} 匹配n次或更多次前面的分组 {,m} 匹配零次到m次前面的分组 ...

  9. Python中按值来获取指定的键

    转自: https://blog.csdn.net/Jerry_1126/article/details/87907162 Python字典中的键是唯一的,但不同的键可以对应同样的值,比如说uid,可 ...

随机推荐

  1. Linux设备驱动剖析之SPI(三)

    572至574行,分配内存,注意对象的类型是struct spidev_data,看下它在drivers/spi/spidev.c中的定义: struct spidev_data { dev_t de ...

  2. Foxmail邮箱最新应用指南二

    Foxmail邮箱最新应用指南二 1.打开Foxmail主界面—工具—账号管理,或者鼠标右击任何已有账号—属性,弹出账号管理窗口,点击左下角的“新建”按钮: 2.输入邮箱地址,下一步→选择邮箱类型(I ...

  3. 【ipad神坑】ipad麦克风听不到声音怎么回事 微信QQ语音视频对方都听不到

    今天遇到了这个问题 说话听不见,但是敲击ipad,可以明显的听到击打的声音 siri也是可以听到 上网上找,大多都是说恢复设置,重启,隐私麦克风权限等解决方案 都是浪费感情 全部尝试过了,依然没有用. ...

  4. Android设计和开发系列第二篇:Navigation Drawer(Design)

    Navigation Drawer Creating a Navigation Drawer The navigation drawer is a panel that transitions in ...

  5. 蓝凌OA常用表整理

    SELECT * FROM V_FI_ORG_EMP  --用户表视图(关联单位)SELECT * FROM FI_ORG_EMP  --用户表 SELECT * FROM FI_ORG_INFO   ...

  6. laravel部署常用命令

    php composer install composer dump-autoload php artisan key:generate .env 及 config/database.php里的数据库 ...

  7. web前端面试题(一)

    1  选择题 1.1   默认情况下,使用P标记会形成什么效果() A.在文字P所在位置中加入8个空格 B.P后面的文字会变成粗体 C.开始新的一行 D.P后面的文字会变成斜体 答案: C 1.2   ...

  8. sencha touch list 选择插件,可记忆已选项,可分组全选

    选择记忆功能参考:https://market.sencha.com/extensions/ext-plugin-rememberselection 插件代码: /* * 记住列表选择状态 * 如果分 ...

  9. spring应用中多次读取http post方法中的流(附源码)

    一.问题简述 先说下为啥有这个需求,在基于spring的web应用中,一般会在controller层获取http方法body中的数据. 方式1: 比如http请求的content-type为appli ...

  10. RDMA卡的检测方法

    1. udaddy This script covers RDMA_CM UD connections. (It establishes a set of unreliable RDMA datagr ...