正则表达式之Dotall模式

Posted 爬虫俱乐部

tags:

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

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

在推文中,元字符“.”匹配的应当是除了回车符(\r)和换行符(\n)之外的任意字符,并且讲到可以利用具有相反含义的元字符的组合([\s\S][\w\W])来匹配任意单个字符。但是,今天要告诉大家,元字符“.”也可以匹配任意单个字符,包括换行符和回车符。这是怎么回事呢?

默认情况下,元字符“.”不会匹配换行符和回车符, 设置了Dotall模式后, 其就会匹配所有字符包括换行符和回车符。但是Stata中的几个正则表达式字符串函数(regexm、regexs、regexr、ustrregexm、ustrregexs等)是不能使用Dotall模式的,那么我们怎么在stata中使用这种模式呢?这里给大家介绍一个命令:jregex。这里命令目前没有上传到ssc上,大家可以输入以下代码下载该命令:

net inst jregex, from("http://wbuchanan.github.io/StataRegex/")

正则表达式之Dotall模式

语法结构

正则表达式之Dotall模式

jregex是一个基于java的插件,用于Stata中的正则表达式。jregex命令可以实现stata与java的交互,通过stata调用java中的正则表达式,jregex的语法结构如下:

正则表达式之Dotall模式

jregex有非常丰富的选项,这篇推文中我们着重介绍以下几个:

1.pattern(string):指的是用来匹配文本的正则表达式,这个选项是必须指定的。

2. dotall:即dotall模式,该模式下,元字符“.”可以匹配任意单个字符,包括换行符和回车符;

3. replace(string):指的是用来替代匹配值的字符串;

4. repfirst:指定该选项后,仅仅替换第一个匹配值;

正则表达式之Dotall模式

例子

正则表达式之Dotall模式

我们来看一个例子,首先用file命令生成一个名为“temp”的txt文件:

tempname temp

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

file write `temp' `"    <div id="box" > "' _n

file write `temp' `"        <div id="content"> "' _n

file write `temp' `"               <pre>"' _n

file write `temp' `"爬虫俱乐部"' _n

file write `temp' `"将爬虫进行到底 </pre> "' _n

file write `temp' `"                </div> "' _n

file write `temp' `"                <div style="clear:both"></div>  "'

file close `temp'

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

正则表达式之Dotall模式

假设temp.txt是源代码的一部分,首先,将其用fileread()函数导入stata:

clear

set more off

set obs 1

gen v = fileread("temp.txt")

list

正则表达式之Dotall模式

在推文中,我们讲到上图阴影部分(即文本不同行之间)是存在换行符和回车符的,现在假设要从变量v中提取“爬虫俱乐部”以及“将爬虫进行到底”这两个字符串,通过分析网页源代码可知,在提取内容的起始位置有一个唯一的字符串“<pre>”,末尾位置有唯一的字符串“</pre>”,那么我们把字符串“<pre>” 及之前多余的字符串和“</pre>”及之后多余的字符串删掉即可,我们首先用元字符“.”进行匹配:

replace v = ustrregexra(v,".+<pre>","")

replace v = ustrregexra(v,"</pre>.+","")

list

正则表达式之Dotall模式

由于这里存在着换行符(\n)和回车符(\r),而元字符“.”不能匹配到它们,因此匹配结果仅仅是位于字符串“<pre>”的所在行以及字符串“</pre>”的所在行。因此,在没有指定Dotall模式下,元字符“.”是不能匹配换行符和回车符的,这在之前的推文中已经详细介绍过。接下来,我们用jregex命令进行替换,并指定Dotall模式

jregex replace v ,p(".+<pre>") rep("") dotall

jregex replace v ,p("</pre>.+") rep("") dotall

首先,简单介绍一下上述程序:

(1) jregex replace v指的是直接在变量v上进行修改,如果v后边再跟一个新变量(比如说:v1),即jregex replace v v1,那么将生成一个新变量v1,原变量v的内容不变,生成的新变量v1是匹配和替换后的结果;

(2)选项p(".+<pre>"),即pattern(string),指的是用来匹配文本的正则表达式,这里“p(".+<pre>")”指的是字符串“<pre>”及其之前的多余字符串;

(3)选项rep(""),即replace(string):指的是用来替代匹配值的字符串,这里把匹配值(选项p()的匹配结果)全部替换为missing。

(4)dotall:即指定dotall模式

compress

list

正则表达式之Dotall模式

可以看到,在Dotall模式下,元字“.”是可以匹配换行符和回车符的。我们再来看一下,stata内存中的数据:

正则表达式之Dotall模式

我们注意到,stata编辑框中并没有显示出文本的内容,这是因为我们用正则表达式".+<pre>"和"</pre>.+"匹配字符串“<pre>” 及之前多余的字符串和“</pre>”及之后多余的字符串,并将其替换为missing,但是“爬虫俱乐部”之前,及“爬虫俱乐部”和“将爬虫进行到底”之间的换行符和回车符并没有删除,所以编辑框中没有显示出文本的内容,我们可以用字符串函数ustrregexra()或者jregex命令将换行符和回车符删掉,这里我们用jregex命令。

jregex replace v ,p("\r\n") rep("")

正则表达式之Dotall模式

到了这里,大家应该非常清楚正则表达式的Dotall模式了,关于jregex命令的内容还有很多,我们将在之后的推文中继续介绍相关用法,请大家继续关注爬虫俱乐部哦!

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

正则表达式之Dotall模式

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

                        文字编辑:王   明

技术总编:刘贝贝



往期推文推荐:



关于我们

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

投稿邮箱:statatraining@163.com

欢迎关注爬虫俱乐部

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

Javascript 正则扩展之dotAll模式

Javascript 正则扩展之dotAll模式

Javascript 正则扩展之dotAll模式

ES2018 新特征之:正则表达式反向(lookbehind)断言

Python: 正则表达式匹配多行,实现多行匹配模式

正则表达式——Pattern.DOTALL