本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法。分享给大家供大家参考,具体如下:
业务场景:
从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下.
难点:
处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理.
往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别。
示例一:
从QQ纯真数据库中解析出省市县等特定词语,这里的正则表达式基本能够满足业务场景,懒惰匹配?非常必要,因为处理不好,会得不到我们想要的效果。个中妙处,还请各位看官自己琢磨,我这里只点到为止!
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#!/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中得到“本站主数据:”那部分的信息。
下面是我摸索的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/usr/bin/env python
#encoding: utf-8
#date: 2016-03-31
#note: 测试中遇到的问题,请求指定的链接会有超时现象,可以多请求几次
import
requests, re
import
sys
reload
(sys)
sys.setdefaultencoding(
'utf8'
)
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)
|
下面是截图