正则表达式--懒惰模式
本文作者:张孟晗,中南财经政法大学统计与数学学院
本文编辑:王玉洁
技术总编:戴 雯
Stata&Python云端课程来啦!
为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程、Stata基础课程、Stata进阶课程、Stata文本分析、正则表达式、网络爬虫、基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~
ustrregexm()
、ustrregexs()
、ustrregexrf()
、ustrregexra()
这四个字符串函数可以使用懒惰模式。当在数量元字符后面跟上?
时,会进入匹配的懒惰模式。在懒惰模式下,首先将字符串中的第一个字符与正则表达式尝试匹配,如果匹配不成功,就读入下一个字符,使用两个字符组成的子字符串尝试匹配。如果匹配还是不成功,继续读入下一个字符。如果直到读入整个字符串都没有实现匹配,就返回从第二个字符开始,重复上述的工作,直到匹配成功或者全部子字符串均无法与正则表达式相匹配。我们也可以把这个模式解释为:从头开始一个字符一个字符地吃,能少吃绝不多吃,直到匹配成功为止。这与贪婪模式尽可能的多吃形成了鲜明对比,也是两种模式的区别所在。
1
,说明stata
被匹配到了并且被替换为了空,所以最后就只剩下了1
。ta1
,说明sta
被匹配到了并且被替换为了空,所以最后就只剩下了ta1
。为加深理解,下面来一步步向大家剖析懒惰模式的具体运行过程:可以看到,我们输入的字符串为
stata1
,我们输入的正则表达式为s.*?a
,其中.
表示匹配除换行符和回车符外的任意单个字符,*
为一个数量元字符,表示匹配前一个字符或子表达式任意次,可以匹配零次。?
表示匹配的模式是懒惰模式,即我们尽可能地少匹配。最后的""
表示我们要将匹配到的字符串替换为空。连起来说就是,我们要将字符串stata1
中以s
开头a
结尾的部分替换为空,并且以s
开头a
结尾的部分越短越好。既然我们输入的正则表达式是
s.*?a
,那么便会对字符串stata1
从头开始匹配,stata1
的第一个s
很轻松的便和正则表达式的第一个s
匹配上了,而中间可以匹配任意个字符串,我们先暂且不管,最后一个a
限制了要以a
进行结尾。但我们可以看到,stata1
里的a一共有两个,根据结果我们也可以发现,实际上匹配到的是第一个a
。这是因为*
后面跟的是?
,说明是惰性匹配,即匹配尽可能少的字符,当我们匹配到第一个a
时,里面包含的字符串是最少的,所以匹配就立马停止了,而不会像贪婪匹配一样,继续向后匹配,看看还有没有可能匹配到符合要求的更长的字符,显然,贪婪匹配就会匹配到第二个a
了。第一次匹配到了
sta
后,继续向后匹配,剩余的ta1
中再也没有字符能与s
相匹配了,所以匹配结束。并且唯一被匹配到的sta
被替换为了空,即返回结果ta1
。
下面让我们来看看它们与懒惰模式相结合会产生什么不一样的效果吧!
当*
与?
结合:从结果中我们可以看到,只有s
被替换为空,也就是说s
后面没有匹配到任意一个字符。这是因为.*
表示匹配任意个除换行符和回车符外的字符,而加上了?
后,在懒惰模式下,任意个字符取最少当然是0个啦,于是,便直接不再匹配了。
+
与?
结合:从结果中我们可以看到,只有st
被替换为空,也就是说s
后面仅匹配到了一个字符t
。这是因为.+
表示匹配一个或多个除换行符和回车符外的字符,而加上了?
后,在懒惰模式下,一个或多个字符取最少当然是1个啦,于是,便向后再匹配了一个t
便停止了。?
与?
结合:这里我们需要注意的是,第一个问号指的是数量元字符,而第二个问号是指定懒惰模式。从结果中我们可以看到,只有s
被替换为空,也就是说s
后面没有匹配到任意一个字符。这是因为.?
表示匹配零个或一个除换行符和回车符外的字符,而加上了?
后,在懒惰模式下,零个或一个字符取最少当然是0个啦,于是,便直接不再匹配了。{m,n}
与?
结合:从结果中我们可以看到,只有sta
被替换为空,也就是说s
后面仅匹配到了两个字符ta
。这是因为.{2,5}
表示匹配二至五个除换行符和回车符外的字符,而加上了?
后,在懒惰模式下,二至五个字符取最少当然是2个啦,于是,便向后再匹配两个字符ta
便停止了。最后,我们为大家揭秘雪球网(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)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。