正则表达式之匹配汉字

Posted 爬虫俱乐部

tags:

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


字符的编码与解码


我们知道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,"[-]+")


执行结果如下:

正则表达式之匹配汉字



接下来是空气质量报告

全国空气质量如下

正则表达式之匹配汉字

河北的朋友们珍重


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

编辑by强宇曦



往期推文推荐:

2

3

4

5

6

7

8

9.




关于我们


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

欢迎关注爬虫俱乐部

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

java之endwith()方法以及正则表达式匹配中文

正则表达式如何匹配汉字?

用JAVA语言编写正则表达式匹配指定的汉字的方法

如何用正则表达式匹配汉字

SUBLIME 正则表达式,如何匹配每行出现的第一个汉字

求一个PHP正则表达式匹配(字母、数字、汉字、下划线)