zoukankan      html  css  js  c++  java
  • Python中使用中文正则表达式匹配指定的中文字符串

    业务场景

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

    难点:

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

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

    示例一:

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

    代码如下:

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

    运行截图


    示例二

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

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


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

    下面是我摸索的代码

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

    下面是截图


    版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    机器学习理解
    如何让Vim成为我们的神器
    新一代 Linux 文件系统 btrfs 简介 【转载】
    第一次写Linux下Makefile的笔记
    UEFI boot sequence
    #pragma pack
    Linux makefile sample
    解决ScrollView中嵌套ListView滚动效果冲突问题
    Android SqLite升级
    Android 播放gif图片
  • 原文地址:https://www.cnblogs.com/yanzi-meng/p/7921301.html
Copyright © 2011-2022 走看看