本文作者:李家耀 河南大学经济学院
本文编辑:刘恒新
技术总编:李婷婷
Stata and Python 数据分析



在 Stata 中,ustrregexs 和ustrregexm 是用于处理字符串匹配和正则表达式的函数。它们通常用于对字符串进行搜索、匹配和替换等操作。
clear alluse "D:\temp\New_Comprehensive_August_30_2023.dta"gen v1=ustrregexs(0) if ustrregexm(country,"[^0-9]+")

这个命令是指生成一个名为 v1 的新变量,该变量的值是在 "country" 变量中找到的不包含数字的字符串。
具体来说就是利用ustrregexm(country, "[^0-9]+") 正则表达式匹配 "country" 变量中不包含数字的字符串。其中[^0-9]+ 表示匹配不包含数字的字符,而+ 表示匹配一个或多个这样的字符。
ustrregexs(0)提取出正则表达式匹配的内容,即匹配到的字符串。因为 (0) 表示整个匹配的字符串,因此ustrregexs(0)是提取出整个匹配到的字符串。而 (1)、(2) 等表示匹配的第几个子表达式对应的子字符串。因此,整体来说,这一行的作用是在 "country" 变量中找到不包含数字的字符串,并将这些字符串存储在新的变量 v1 中。
gen v2=ustrregexs(1) if ustrregexm(country,"(.+)[0-9]{4}")

gen v2 = ustrregexs(1) if ustrregexm(country, "(.+)[0-9]{4}")这行代码使用了gen命令,创建了一个新的变量 v2,并将其赋值为匹配到的字符串的第一个子表达式。在这行例子中,第一个子表达式是(.+),它表示匹配到的任意字符。只有在 country 中的字符串满足正则表达式条件的情况下,v2 才会被赋值;否则,它将保持缺失值。
具体来说就是ustrregexm(country, "(.+)[0-9]{4}")这个指令使用了ustrregexm函数,它是用于执行正则表达式匹配的字符串函数。在这里,它的目标是country 变量,而正则表达式 (.+)[0-9]{4} 的含义是匹配任意字符(表示国家名称的部分),后面跟着至少四个数字。这个正则表达式的目的是找到 country 中以四个连续数字结尾的字符串。
总体而言,这段代码的目的是在Stata数据集中创建一个新变量 v2,其中包含了从 country 中提取的匹配到的部分,该部分是由正则表达式(.*)([0-9]{4}) 匹配到的,表示国家名称的部分。
3.利用ustrregexra
gen v3=ustrregexra(country,"[0-9]+"," ",.)

ustrregexra(country,"[0-9]+","",.)这个命令使用了ustrregexra函数,该函数Stata中用于执行正则表达式替换的函数。
具体来说就是ustrregexra(country, "[0-9]+", "", .)这个命令对 country 变量应用了正则表达式替换。正则表达式 [0-9]+ 表示匹配一个或多个数字,而替换的部分是一个空字符串 ""。因此,这个命令的目的是将 country 中的所有数字替换为一个空字符串。
gen v3 = ustrregexra(country, "[0-9]+", "", .)使用了gen命令,创建了一个新的变量 v3,并将其赋值为对 country 应用正则表达式替换后的结果。新的变量 v3 中包含了原始 country 变量,但其中的数字被空字符串替代。
总体而言,这段代码的目的是在Stata数据集中创建一个新变量 v3,其中包含了从 country 中删除数字后的字符串。这种操作可能有助于清理和处理数据,特别是当需要保留字符串中的非数字部分时。
当然,正则表达式有很多种方法。以上的三种方式都是利用[0-9]来进行操作的,事实上我们也可以利用[a-z]或者[a-zA-Z]来进行操作,具体的思路与匹配数字正好相反,也就是匹配数字是为了删除,而匹配字母是为了保存。
举个例子,上述式子中:
gen v1=ustrregexs(0) if ustrregexm(country,"[^0-9]+")
可以改写为:
gen v1=ustrregexs(0) if ustrregexm(country,"[a-zA-Z]+")
虽然匹配的内容不同但是得出的结果是相同的,可见正则表达式的使用是非常灵活的。
replace v4=ustrregexra(v4,"([^0-9])([0-9])","$1;$2")split v4,p(;)drop v42 v4
下面我为大家解释这些代码的含义及作用:
在Stata中,正则表达式的moss(Merge Operator and Search System)是一个用于执行模糊字符串匹配的命令。该命令主要用于在一个字符串变量中查找模式,并将匹配到的结果存储在新的变量中。
moss varname [, options]
其中,varname是你要进行匹配的字符串变量的名称,而 options 是一系列控制匹配行为的选项。以下是一些常用的 moss 命令选项:
(1)match(string): 指定要匹配的字符串或正则表达式。例如,match("pattern")表示匹配指定的字符串模式。
(2)regex: 指示使用正则表达式进行匹配。如果不指定此选项,默认情况下,moss 将使用通配符进行匹配。
(3)pre(newvar): 指示将匹配的结果存储在一个新变量中,该新变量的名称由 newvar 指定。
(4)replace: 指示用匹配的结果替换原始变量中的值。
(5)gen(newvar): 类似于 pre,指示将匹配的结果存储在一个新变量中,但不创建新变量,而是使用已存在的变量名。
moss country,match("(^[a-zA-Z]+)") regex pre(v5)

这个Stata代码使用 moss 命令对country 变量执行模糊字符串匹配,使用正则表达式 (^[a-zA-Z]+) 来匹配以字母开头的字符串,并将匹配到的结果存储在一个新的变量中,该变量的名称为 v5。
moss country, match("(^[a-zA-Z]+)") regex pre(v5)
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
【爬虫实战】python文本分析库——Gensi
Python可视化-绘制三维空间空间图形
使用Stata遍历文件的多种方式
Python构造数据透视表
Python可视化-Bokeh库
基于Python的文本摘要提取
覆水难收!B站弹幕解读舆论情绪
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到 statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

