查看原文
其他

正则表达式--懒惰模式

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张孟晗,中南财经政法大学统计与数学学院

本文编辑:王玉洁

技术总编:戴   雯

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

引言

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出符合某个条件的子串等。目前,正则表达式已经在很多软件中得到广泛的应用,如Python、C、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。这次小编向大家介绍一下stata中正则表达式的懒惰模式。
一、概念介绍

在Stata 中,ustrregexm()ustrregexs()ustrregexrf()ustrregexra()这四个字符串函数可以使用懒惰模式。

当在数量元字符后面跟上?时,会进入匹配的懒惰模式。在懒惰模式下,首先将字符串中的第一个字符与正则表达式尝试匹配,如果匹配不成功,就读入下一个字符,使用两个字符组成的子字符串尝试匹配。如果匹配还是不成功,继续读入下一个字符。如果直到读入整个字符串都没有实现匹配,就返回从第二个字符开始,重复上述的工作,直到匹配成功或者全部子字符串均无法与正则表达式相匹配。我们也可以把这个模式解释为:从头开始一个字符一个字符地吃,能少吃绝不多吃,直到匹配成功为止。这与贪婪模式尽可能的多吃形成了鲜明对比,也是两种模式的区别所在。

二、模式运作过程讲解

下面,我们用一个具体的运行过程来演示一下懒惰模式是如何运作的。
不妨首先看下贪婪模式的运行结果:

可以看到,运行的结果为1,说明stata被匹配到了并且被替换为了空,所以最后就只剩下了1
让我们再来看看懒惰模式的运行结果:

可以看到,运行的结果为ta1,说明sta被匹配到了并且被替换为了空,所以最后就只剩下了ta1。为加深理解,下面来一步步向大家剖析懒惰模式的具体运行过程:
  1. 可以看到,我们输入的字符串为stata1,我们输入的正则表达式为s.*?a,其中.表示匹配除换行符和回车符外的任意单个字符,*为一个数量元字符,表示匹配前一个字符或子表达式任意次,可以匹配零次。?表示匹配的模式是懒惰模式,即我们尽可能地少匹配。最后的""表示我们要将匹配到的字符串替换为空。连起来说就是,我们要将字符串stata1中以s开头a结尾的部分替换为空,并且以s开头a结尾的部分越短越好。

  2. 既然我们输入的正则表达式是s.*?a,那么便会对字符串stata1从头开始匹配,stata1的第一个s很轻松的便和正则表达式的第一个s匹配上了,而中间可以匹配任意个字符串,我们先暂且不管,最后一个a限制了要以a进行结尾。但我们可以看到,stata1里的a一共有两个,根据结果我们也可以发现,实际上匹配到的是第一个a。这是因为*后面跟的是,说明是惰性匹配,即匹配尽可能少的字符,当我们匹配到第一个a时,里面包含的字符串是最少的,所以匹配就立马停止了,而不会像贪婪匹配一样,继续向后匹配,看看还有没有可能匹配到符合要求的更长的字符,显然,贪婪匹配就会匹配到第二个a了。

  3. 第一次匹配到了sta后,继续向后匹配,剩余的ta1中再也没有字符能与s相匹配了,所以匹配结束。并且唯一被匹配到的sta被替换为了空,即返回结果ta1

三、数量元字符与懒惰模式的搭配使用

以下是Stata中的数量元字符:

下面让我们来看看它们与懒惰模式相结合会产生什么不一样的效果吧!

*结合:从结果中我们可以看到,只有s被替换为空,也就是说s后面没有匹配到任意一个字符。这是因为.*表示匹配任意个除换行符和回车符外的字符,而加上了?后,在懒惰模式下,任意个字符取最少当然是0个啦,于是,便直接不再匹配了。

+结合:从结果中我们可以看到,只有st被替换为空,也就是说s后面仅匹配到了一个字符t。这是因为.+表示匹配一个或多个除换行符和回车符外的字符,而加上了?后,在懒惰模式下,一个或多个字符取最少当然是1个啦,于是,便向后再匹配了一个t便停止了。

结合:这里我们需要注意的是,第一个问号指的是数量元字符,而第二个问号是指定懒惰模式。从结果中我们可以看到,只有s被替换为空,也就是说s后面没有匹配到任意一个字符。这是因为.?表示匹配零个或一个除换行符和回车符外的字符,而加上了?后,在懒惰模式下,零个或一个字符取最少当然是0个啦,于是,便直接不再匹配了。

{m,n}结合:从结果中我们可以看到,只有sta被替换为空,也就是说s后面仅匹配到了两个字符ta。这是因为.{2,5}表示匹配二至五个除换行符和回车符外的字符,而加上了?后,在懒惰模式下,二至五个字符取最少当然是2个啦,于是,便向后再匹配两个字符ta便停止了。

以上就是本篇文章对正则表达式懒惰模式的简单介绍啦!正则表达式作为一种强大、便捷、高效的文本处理工具,大家可以多多进行了解,下期再见啦!
END

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐        爬完独立董事的年薪,我的眼镜跌破了!
        识别旅游“照骗”——看风景名胜是否名副其实        主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

在Stata中轻松运用program编写命令

Meta Analysis in Stata17      

芒果TV视频弹幕爬取之《我在他乡挺好的》

Stata中的判断神器——confirm命令

cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存