连享会计量方法专题……
文章目录
给你一份公司年报,如何快速地从中找出与数值有关的内容。好朋友让你推荐好看的电影,如何快速地从豆瓣网站下载到每部电影的评分。 这里涉及到的问题就是如何从文本数据中挖掘出所需要的信息。Stata 中的字符函数为这一操作的实现提供了便利,详细可以通过 help string_functions
查看具体的用法和实例。本文主要是针对字符函数里面的正则表达式函数 ( regular expression )。
Stata 14 之前的版本主要的正则表达式函数有:regexm
,regexr
和regexs
, reg 代表regular,ex代表expression。匹配主要是基于 Henry Spencer’s NFA 算法, 与 POSIX.2 标准相似。
regexm
: m 代表 match-----匹配。
regexr
: r 代表 replace-----替代。
regexs
: s 代表 subexpression-----截取。
Stata14 之前版本只能处理普通的 ASCII 字符,例如字母( a-z,A-z),数字 ( 0-9 )及普通的标点符号字符。Stata 14 之后的版本加强了编码转换 ( unicode ),能够处理其他非普通编码 ASCII 字符,如中文,日语和韩语等。相应的,Stata 14 引入了几个新的有关正则表达式命令:
Stata 14 版本主要的正则表达式函数有:ustrregexm
,ustrregexrf
,ustrregexra
和 ustrregexs
,unstr 代表 unicode string。
ustrregexm
: 匹配
ustrregexrf
: f 代表 first。表示只替代第一次出现的匹配字符。
ustrregexra
: a 代表 all。表示替代全部匹配到的字符。
ustrregexs
: 截取
因此,Stata 14 加强了正则表达式的功能,可以根据 序列、POSIX 字符类 等进行匹配。下面我们将进行一一说明。
一. 命令基本语法
本文以Stata 14 之前版本的三个主要正则表达式命令为例,对其语法进行说明,如下图所示:
从上面语法可以看出,正确使用这些命令的一个关键点在于如何填写待匹配规则,比如想从文本中匹配出与数值有关的内容,可以用 0-9,那么命令可以写为:
clear
input str10 income
"abc"
"ab"
"aa"
"abcd"
"aad"
"aab123"
"cdf12345"
"123"
"Abc"
end
. gen index1 = regexm(income,"[0-9]") /* [0-9] 表示数值*/
基于此,本文以下部分主要针对匹配内容的相关规定进行阐述,分别介绍 元字符,序列,字符类,数量词,POSIX字符类等进
行介绍。
二. 基本规则
(1) 元字符
元字符是指的一类特殊字符,包括 *
+
?
^
$
|
(
)
[
]
{
}
\
等。匹配这些字符需要在前面加上\
。
例如:
clear
input str3 num str2 name str10 per str6 income
-1 a "10%" "[9747"
1 b "62%" "1,234"
1 a "53%" "938.9"
-1 c "48,6%" "*8344"
2 d "58%" "2398"
-2 e "46%" "-"
-3 c "78%" "53822"
3 d "92,2%" "na"
-1 e "65%" "$28477"
1 b "3,6%" "n/a"
end
若想匹配出包括 [
,*
,$
等特殊字符的部分,可以利用如下代码:
gen index = regexm(income,"\[") /*匹配包含[号的*/
gen index1 = regexm(income,"\\$") /*匹配包含$号的*/
gen index2 = regexm(income,"[\$]")
gen index3 = regexm(income,"[$]")
gen index4 = regexm(income,"[`=char(36)']") /*利用charlist查看相应的代码*/
gen index5 = regexm(income,"\*") /*匹配包含*号的*/
gen index6 = regexm(income,"[\*|\[]") /*|表示或者,匹配包含[号或者*号的*/
list
需要特别注意的是 $
符号比较特殊,其在 Stata 中还可以表示全局宏的引用,所以可以不加 \
。
(2) 序列
较为常用的序列主要有如下:
\d
匹配数字字符
\D
匹配非数字字符
\s
匹配间隔符(空格)
\S
匹配非间隔符(非空格)
\w
匹配单词字符
\W
匹配非单词字符
\b
匹配词界
\B
匹配非词界
第一: \D
表示非数值,\d
表示数值
回顾下前面的例子,若要从文本中匹配包括数值的部分,可以用 0-9,这里也可以用 \d
进行匹配。例如:
clear
input str12 income
"123"
"acb"
"12a"
end
gen index1 = ustrregexm(income,"\D") /*\D表示非数值*/
gen index2 = ustrregexm(income,"\d") /*\D表示数值*/
第二:\w
和 \W
表示单词和非单词字符
单词字符是包括下划线的任何单词字符(字母,数字,下划线,汉字),即 [a-zA-Z_0-9]
clear
input str64 income
"the dandelion war 2010"
end
gen make2 = income
gen make3 = income
replace make2 = ustrregexra(make2, "\w", "_")
replace make3 = ustrregexra(make2, "\W", "_")