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

运行截图


示例二

从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.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)

下面是截图


  • 28
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在处理正则表达式匹配指定中文字符串时,需要注意字符编码的问题。根据引用的建议,最好统一使用utf8编码。如果不是这种最优情况,也可以进行相应的处理。在引用的代码示例使用了unicode函数将html内容转换为unicode编码,以便进行正则匹配。在正则表达式,可以使用`\u4e00-\u9fa5`表示匹配所有的中文字符范围。例如,可以使用`re.findall(ur'[\u4e00-\u9fa5]+', string)`来匹配一个字符串的所有中文字符。此外,引用提到可以使用replace方法或group方法进行匹配。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python使用中文正则表达式匹配指定中文字符串](https://blog.csdn.net/tao_627/article/details/51019972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [正则表达式中文字符匹配](https://blog.csdn.net/qq_57059662/article/details/127711890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值