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

Posted 爬虫俱乐部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式之多行匹配模式相关的知识,希望对你有一定的参考价值。

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

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

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

有许多正则表达式都支持使用一些特殊元字符去改变另外一些元字符的做法,用来启用多行匹配模式(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的做法不会收到在多行匹配模式下使用“^”和“$”的效果。

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

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

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

文字编辑/高金凤

技术总编/刘贝贝


往期推文推荐:



关于我们

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

投稿邮箱:statatraining@163.com

欢迎关注爬虫俱乐部

以上是关于正则表达式之多行匹配模式的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式,多行匹配模式..为啥这不起作用?

js入门篇之正则表达式基础

js入门篇之正则表达式基础

JQuery之正则表达式

正则表达式

正则表达式匹配换行