正则表达式匹配指定中文字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式匹配指定中文字符串相关的知识,希望对你有一定的参考价值。

大神们早上好,刚开始学习正则。问大家个问题。
例:string str = "早上好aaa您好bbb大家好ddd……";
怎么用正则匹配判断该字符串(这个字符串也可能是随机给的,)是否包含“早上好”“您好”“大家好”等(关键字也可能会判断是否包含多个)。


public void ShowStructure()

        //要匹配的字符串
        string text = "早上好aaa您好bbb大家好ddd……";
        //正则表达式
        string pattern = @"[\\u4e00-\\u9fff]+"; 
        Regex r = new Regex(pattern);
        //使用正则表达式匹配字符串,仅返回一次匹配结果
        Match m = r.Match(text);
        while (m.Success)
        

                //显示匹配开始处的索引值和匹配到的值
                System.Console.WriteLine("Match=[" + m + "]");
                CaptureCollection cc = m.Captures;
                foreach (Capture c in cc)
                
                        Console.WriteLine("\\tCapture=[" + c + "]");
                
                for (int i = 0; i < m.Groups.Count; i++)
                
                        Group group = m.Groups[i];
                        System.Console.WriteLine("\\t\\tGroups[0]=[1]", i, group);
                        for (int j = 0; j < group.Captures.Count; j++)
                        
                                Capture capture = group.Captures[j];
                                Console.WriteLine("\\t\\t\\tCaptures[0]=[1]", j, capture);
                        
                
                //进行下一次匹配.
                m = m.NextMatch();
        

参考技术A 如果是GB码,可能是双字节GBK[0x81-0xfe][0x40-0xfe],也可能是四字节GB18030[0x81-0xfe][0x30-0x39][0x81-0xfe][0x30-0x39]。
汉字在Unicode中称作CJK 统一表意符号 (CJK Unified Ideographs),包括
[\u+3400-\u+4dbf\u4e00-\u9fff\u+20000-\u3fffd\ue000-f8ff]
最后一项为PUA,参见百度百科【统一码】。

转载Python使用中文正则表达式匹配指定中文字符串的方法示例

本文实例讲述了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)

 

下面是截图

 

技术分享图片

 


以上是关于正则表达式匹配指定中文字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配指定字符开始和指定字符结束?

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

正则表达式匹配指定数据和字母

正则表达式:匹配指定字符后面的字符怎样实现?

Js正则表达式的如何写这样一个匹配规则!1) 取指定范围的内容 2)过滤指定范围的内容

转载Python使用中文正则表达式匹配指定中文字符串的方法示例