正则表达式之多次匹配
本文作者:赵一帆,中南财经政法大学金融学院
本文编辑:智淼
技术总编:方一卓
Stata and Python 数据分析
由李春涛教授和团队成员司海涛、薛原编写的《Stata正则表达式及其在财务数据中的应用》终于和大家见面啦!爬虫俱乐部特此为大家准备了100本,即日起购买爬虫俱乐部课程,可赠送本书一本,先到先得!
购书链接:
导语
众所周知,我们在Stata中可以使用ustrregexm()、ustrregexs()、ustrregexrf()、ustrregexra()四个函数对Unicode字符串进行正则匹配。最近,笔者发现,在使用ustrregexm()、ustrregexs()进行正则匹配提取时,仅获得第一次匹配成功的文本。下面,我们就来看看该问题如何解决。
1
ustrregexm() 仅匹配一次
例如,我们想要提取出《红楼梦》txt版本中所有的对话文本,用作称呼语的语料研究。我们首先想到使用ustrregexm()、ustrregexs()来提取:
clear all
import delimited using "曹雪芹 红楼梦原文 白版.txt",encoding("utf-8")
gen temp = ustrregexs(0) if ustrregexm(v1, "“(.*?)”") //由于要提取对话,(.*?)外面为中文双引号,最外层为英文引号
执行结果如下图所示:
显然,该命令只能提取出第一次匹配成功的对话文本。查看ustrregexm()、ustrregexs()的help文件,也没有发现允许多次匹配的参数设置。这表明,如果同一字符串中有多句对话,该命令就无能为力了。
2
moss命令在多次匹配中的使用
moss命令是外部命令,使用之前需要先安装:
ssc install moss
安装完成后,help moss查看该命令的语法:
moss strvar [if] [in] , match(["]pattern["]) ///
[regex prefix(prefix) suffix(suffix) maximum(#) unicode]
其中,starvar是字符串变量,可以对其使用条件筛选;match(["]pattern["])是我们想要匹配的字符串,如果你要匹配正则表达式,就需要添加regex选项;prefix(prefix)和suffix(suffix)选项用于为新增字段名添加指定的前缀或后缀,但两者不可同时使用。使用maximum(#)可以指定匹配的最大次数(#);如果我们要对中文等Unicode字符进行处理,则需要使用unicode选项,否则该命令无法正常执行。现在,我们使用moss命令重新提取《红楼梦》中的对话文本:
clear all
import delimited using "曹雪芹 红楼梦原文 白版.txt",encoding("utf-8")
moss v1, match("“(.*?)”") regex unicode
执行结果如下图所示:
可以看到moss不仅为我们找出了所有的对话文本(_match*),而且给出了每次匹配成功的位置(_pos*)以及匹配成功的次数(_count)。经过整理,我们可以导出所有被中文双引号“ ”包裹的对话文本:
keep _match*
stack _match*, into(v1)
drop if v1 == ""
keep v1
rename v1 中文对话
export excel "conversation.xlsx",firstrow(var) replace
导出文件的截图如下所示:
以上就是使用moss命令解决正则表达式多次匹配问题的办法啦~另外,该命令在文本分析、语料分析时还可以用作词频统计哦。
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
爬虫君为你的数据自由操碎了心!cnborder重磅推出!
基于Python的假设检验实现 Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令 《Stata正则表达式》由中国金融出版社出版发行 匿名函数lambda到底怎么用?Stata绘图系列—NBER Working paper仿图
Camelot:从PDF中提取表格数据 Stata之计算财务指标——融资约束Stata绘图系列——玩转绘图通用选项之坐标轴玩转地图的好帮手--pyecharts
爬虫俱乐部又又又输送了一位研究助理!!! 【数据分析】一文教你玩转DataFrame【数据分析-入门】一看就会!Numpy的创建、索引、切片与更新
带你玩转Stata编码一言不合就teamviewer 教你用Stata爬取全国疫情风险地区数据,原来这么简单! 关于我们微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可
以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。