正则表达式之匹配汉字

2017-02-15 司海涛 爬虫俱乐部 爬虫俱乐部

哈喽,诸君安。在之前的推文中我们介绍了很多正则表达式的元字符和一些字符串函数。有朋友曾在公众号上提问如何匹配汉字,今天小编就给大家解答疑惑哦!


字符的编码与解码


我 们知道stata14是采用Unicode 编码。Unicode 是全球文字统一编码。它把世界上的各种文字的每一个字符指定唯一编码,实现跨语种、跨平台的应用。中文用户最常接触的是汉字 Unicode 编码。中文字符数量巨大,日常使用的汉字数量有数千个,再加上生僻字,数量达到数万个。那么每一个字符都有一个Unicode码,如果我们知道每一个汉字 的编码,是不是就可以用字符串函数匹配到汉字了呢?


在Stata中有ustrunescape(s)ustrtohex(s[,n]) 两个函数可以实现Unicode转义字符的解码与编码。

1.ustrunescape(s):将unicode转义字符s进行解码。

2.ustrtohex(s[,n]):将字符s从第n个unicode字符开始进行编码,转换成unicode转义字符。


例如: 


dis ustrtohex("爬虫俱乐部") // 将"爬虫俱乐部"进行编码,转换为unicode转义字符

dis ustrunescape("\u722c\u866b\u4ff1\u4e50\u90e8") //对 unicode转义字符进行解码

dis ustrtohex("爬虫俱乐部",2) // 将"爬虫俱乐部"从第二个unicode字符开始进行编码,相当于对"虫俱乐部"进行编码


Unicode转义字符是以“\uXXXX”格式表示的字符,其中X为16进制数字。unicode转义字符在许多领域,尤其是Web前端开发中,有广泛的应用。


Unicode 转义字符可以直接用于正则表达式中,例如0-9的unicode转义字符为\u0030-\u0039,\d即[0-9]可以表示为[\u0030- \u0039]。通过unicode转义字符,我们可以匹配任一unicode码区间内的任一字符。比如基本汉字的unicode转义字符的范围为 \u4e00-\u9fa5。在一些软件里面,[\u4e00-\u9fa5]是规定的匹配汉字的元字符,不能更换范围,但Stata中可以指定具体的范 围。类比于[\u0030-\u0039]对应[0-9], [\u4e00-\u9fa5]也可以替换为[一-龥]来匹配任一基本汉字。


一般情况下,基本汉字是可以解决问题的,当然还有基本汉字补充等一些不常用的汉字。


这里除了基本汉字,其他的都是很生僻的字,一般涉及不到,用这两万多的基本汉字已经足够了。例如扩展A:


栗子说明


为了方便大家尝试,我们手动输入一个数据,程序如下:


clear

set more off

input str40 v

ShangHai上海财经大学636

HuBei中南财经政法大学588

SiChuan西南财经大学590

BeiJing中央财经大学630

BeiJing对外经济贸易大学633

LiaoNing东北财经大学579

BeiJing首都经济贸易大学572

JiangXi江西财经大学566

ZheJiang浙江工商大学561

BeiJing北京工商大学568

end


结果如下:


这个数据是10所财经类院校2015年湖北省的理科录取分数线。现在我们需要把学校名称提取出来,按照往常的做法我们可以通过以下程序来实现这一目的:


gen university1= ustrregexs(1) if ustrregexm(v,"[a-zA-Z]+(.+?)\d")


运行结果如下:


其中,[a-zA-Z]+表示学校所在地,如第一行的ShangHai。\d便是分数线的第一位数字,如第一行的“6”。那么子表达式(.+?)就表示学校所在地与分数线中间的部分,即学校名称。


还有没有其他办法了呢?你要知道,我们现在可是会用stata匹配汉字啦!另外,我们发现学校所在地和分数线分别是英文字符和数字字符,只有学校名称是汉字。因此,我们可以通过直接提取汉字来获取学校名称。


程序如下:


gen university2 = ustrregexs(0) if ustrregexm(v,"[\u4e00-\u9fa5]+")


执行结果如下:


我们看到,两次的结果是一样的。其中,[\u4e00-\u9fa5]表示所有基本汉字的unicode转义字符,其可以匹配到基本汉字。我们前边讲到, [\u4e00-\u9fa5]也可以替换为[一-龥]来匹配任一基本汉字,程序如下:


gen university3 = ustrregexs(0) if ustrregexm(v,"[-]+")


执行结果如下:



接下来是空气质量报告

全国空气质量如下

河北的朋友们珍重


以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~,点赞打赏随您心意,么么哒~

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

编辑by强宇曦



往期推文推荐:

1.合并输出回归结果和其他检验结果——esttab和estadd

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.玩转stata之调用浏览器

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:xueyuan19920310@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号