业务场景:
从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下.
难点:
处理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'本站主数据:(.*?) '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)
下面是截图
#include
题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。 解题: 数值错误的形式有多种多样,但是正确的...
加法伺候 //超过20位数值相加---------------------------------------- function bigNumAdd(a, b) {if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必...
简单record 一下
#include
学习计划 MyPlan11 主题:Python描述统计、简单统计图形 时间:8.5-8.11周内完成 参考资料:新书《谁说菜鸟不会数据分析python篇》 各位星友们,在这个星球里每个人都要逼迫自己学习未知的领域或知识点,每天进步一点点,积累的时间久了 ,菜鸟也能起飞。 完成情况: 在pandas中,使用describe函数进行描述统...
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。 首先,先了解下SocketServer模块中可供使用的类: BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。 TCPServer/UDPS...
题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 示例: 你可以将以下二叉树: 1 / 2 3 / 4 5 序列化为 "[1,2,3,null,null,4,5]" 解题: /*** Definition for a binary tree no...
sd.js import $global from "./global"; import $g from "./sg"; import $ from "jquery"; import {Message, Loading} from "element-ui";//引入饿了么相关组件 import {Base64} from "js-...
原生sd.js---------------------------------------------------------------- const API_ROOT_URL = "http://www.api.com";const $d= {_postList_url: API_ROOT_URL + "/api...
转载地址: https://www.cnblogs.com/exmyth/p/3616672.html在mysql中存在着各种utf8编码格式,如下表:1)utf8_bin2)utf8_general_ci3)utf8_general_csutf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。utf8_genera_ci...