正则表达式之多行匹配模式

2017-11-21 司海涛 爬虫俱乐部 爬虫俱乐部

       有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

       ps:喜大普奔,爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io粉丝们可以通过该网站访问过去的推文哟~

我们之前讲过,元字符“^”匹配一个字符串的开头,元字符“$”匹配一个字符串的结尾。今天又要告诉大家,这一结论也并非绝对正确哦!它还有一个例外或者说有一种改变这种行为的办法,下边且听小编给大家慢慢道来~

有许多正则表达式都支持使用一些特殊元字符去改变另外一些元字符的做法,用来启用多行匹配模式(multiline mode)的(?m)记号就是一个能够改变其他元字符行为的元字符序列。多行匹配模式将使得正则表达式引擎把行分隔符(windows系统,行分隔符为:回车符(\r)+换行符(\n)的组合)当作一个字符串分隔符来对待。在多行匹配模式下,元字符“^”不仅可以匹配正常的字符串开头,还将匹配行分隔符后面开始的位置(这个位置是不可见的);类似地,元字符“$”不仅匹配正常的字符串结尾,还将匹配行分隔符后面结束的位置。

栗子

首先用file命令生成一个名为“temp”的txt文件: 

tempname temp

file open `temp' using temp.txt, text write replace

file write `temp' `"***生成随机日期"' _n

file write `temp' `"clear"' _n

file write `temp' `"set obs 10"' _n

file write `temp' `"gen int bday = uniform()*1000-200"' _n

file write `temp' `"***更改日期的显示格式"' _n

file write `temp' `"format bday %dCY_N_D"' _n

file write `temp' `"***date函数得到stata格式的日期"' _n

file write `temp' `"dis date("2001-09-28", "YMD")"'

file close `temp'

shellout temp.txt  //打开temp.txt文件

如上图所示,我们用file命令写了一段stata的程序,将其用fileread()函数导入stata:

clear

set more off

set obs 1

gen v = fileread("temp.txt")

list

假设我们想要将注释行(即以*开头的行)给删除掉,我们首先在不启动多行匹配的情况下,进行删除:

replace v = ustrregexra(v,"^\*.+","")

list

可以看到,我们用正则表达式"^\*.+"将第一个注释行“***生成随机日期”被删除掉了,而其他注释行并没有被删掉,这里元字符“^”表示匹配字符串开头位置,“\*”是对元字符“*”的转义,表示字符“*”本身,“.+”是一个贪婪匹配模式,由于不同行之间存在换行符和回车符,而元字符“.”,在默认模式下,无法匹配它们。因此,正则表达式"^\*.+"仅仅匹配第一个注释行。

现在我们用(?m)启用多行匹配模式,在使用时,(?m)必须出现在整个模式的最前面,程序如下:

replace v = ustrregexra(v,"(?m)^\*.+","")

list

在该模式下,正则表达式引擎会把行分隔符(windows系统,行分隔符为:回车符(\r)+换行符(\n)的组合)当作一个字符串分隔符来对待,这样“^”不仅匹配正常的字符串开头,还将匹配行分隔符后面开始的位置。"(?m)^\*.+"将把换行符视为一个字符串分隔符,这样就可以把每一行注释都匹配出来了。

最后需要说明的是,多行模式中必定包含 “^” 或 “$” 或这两者同时包含,否则即便指定(?m),也是没有意义的。另外,经笔者测试,在Stata中,还支持使用\A来定义一个字符串的开始,以\Z来定义一个字符串的结束的做法。此时,\A\Z的作用将基本等价于“^”和“$”但请注意\A\Z不会因为加上了(?m)前缀而改变行为,换句话说,在多行匹配模式下使用\A\Z的做法不会收到在多行匹配模式下使用“^”和“$”的效果。

注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

         应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您 更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑/高金凤

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.Stata 15Markdown——没有做不到,只有想不到!

8.矩阵和宏的故事

9.shelloutopen anything

10.Putpdf--神奇的转换工具



关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

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

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号