指点成金-最美分享吧

登录

正则表达式之空白元字符

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了正则表达式之空白元字符相关的知识,希望对你有一定的参考价值。





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

ps:(1)爬虫俱乐部将于2018年1月20日至28日在武汉举行两期Stata编程技术定制培训。详情请戳《》





元字符大致可以分为两种:一种是用来匹配文本的(比如.),另一种是正则表达式的语法所要求的(比如“[ ]")。在进行正则表达式搜索的时候,我们经常会遇到需要对原始文本里的空白字符进行匹配的情况。比如说,我们可能需要把所有的制表符找出来,或者我们需要把换行符找出来,这类字符很难被直接输入到一个正则表达式里,但我们可以使用下表列出的特殊元字符来输入它们。

往期回顾

之前的推文中,我们多次提到“s”是一个特殊元字符,可以匹配空白字符,即上表中所示的所有字符,那既然有了“s”这个“多功能”的“空白元字符”,为什么还需要 、 、 之类的呢?设想一下,你在统计词频时,文本中的某个词可能由于分行,从而导致无法匹配到,此时你需要删除文本中的换行符和回车符,使不同行之间的内容连接在一起,当然s也包括了换行符和回车符,但是为什么不能用其将换行、回车删掉呢?原因是s也能匹配制表符或空格,而有些制表符或空格是不能删除的,例如表格中两个单元格之间的空格如果我们删除了,那么单元格之间的内容就连在了一起,这在推文《》中进行了详细说明。

本篇推文重点介绍一下制表符。制表符分为两种:水平制表符( )和垂直制表符(v)。

垂直制表符(v)不常用,它的作用是让v后面的字符从下一行开始输出,且开始的列数为v前一个字符所在列的后面一列,我们这里主要介绍一下水平制表符,一般来说,其在终端和文件中的输出显示相当于按下键盘TAB键效果。Windows系统中,显示水平制表符占8列(即8个字节)。同时水平制表符开始占据的初始位置是第8*n列(第一列的下标为0)。那么制表符导入到Stata中,究竟是什么呢?

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

tempname temp

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

file write `temp" `"`=char(9)"爬虫俱乐部"" _n

file write `temp" `"将爬虫进行到底`=char(9)""" _n

file close `temp"

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

首先,我们用file命令在第一行“爬虫俱乐部”前读入一个`=char(9)",即水平制表符,同样在第二行“将爬虫进行到底”后读入一个水平制表符。但是注意到,第一行的制表符占了8列(即8个字节,对应下行“将爬虫进”四个汉字,1个汉字在ASCII编码中占2个字节),而输入到第二行的制表符,却只占了2个字节(图中蓝色部分,对应上行一个汉字“乐”),这是为什么呢?

Tab键有这样的特征:每按一次,光标就自动定位到下一个制表符的位置,而且在一个制表符宽度范围内,增加或者删除文字不会影响下一制表符中的文字位置。

因此,不管光标处于什么位置,按一下tab键,光标就会自动定位到下一个制表符的位置,而这个位置的列数,一定是8的整数倍。所以,虽然在文本中的两行均读入一个水平制表符,第一个占了8列,而第二个制表符因为前边的字符占了14列,下一个制表符的位置为第16列,因此其只占2列。这就是为什么有时候我们在文档中的不同位置敲击Tab键,长度不一样的原因。

制表符导入到Stata中,一定还是制表符本身吗?答案是否定的,其还可能变为n个连续的空格。例如:用fileread()函数或import delimited导入Stata后,其还是制表符本身,但是用infix读入Stata后,制表符就变成n个连续的空格(为什么是n个,而不是确定的个数呢?),下边我们以两个简单的例子加以说明:

01

fileread()函数将temp.txt导入Stata

clear
set more off
set obs 1
gen v = fileread("temp.txt")

接着,我们用元字符“ ”将水平制表符替换为“X”

replace v = ustrregexra(v," ","X")

可以看到,两个制表符均被替换为“X”。

02

用infix导入temp.txt文件

infix str50 v 1-200 using temp.txt,clear

同样,我们用元字符“ ”将水平制表符替换为“X”:

replace v = ustrregexra(v," ","X")

list

可以看到,用infix将temp.txt导入Stata后,制表符是不存在的,那么是不是变成了我们前边所说的n个空格呢?我们接着进行替换:

replace v = ustrregexra(v," ","X")

同样,没有进行替换。原因是,用infix读入文本文档,其中的制表符会变为4个连续的空格,并且infix读入后会自动将每一行开头和结尾的空格删除掉,因为本例中的制表符均在两行的首尾处,因此被删除掉了。如果,Tab键位于字符串之间,导入Stata后就会变味n个连续的空格,例如:

tempname temp

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

file write `temp" `"`=char(9)"爬虫俱乐部`=char(9)"将爬虫`=char(9)"进行到底"" _n

file close `temp"

shellout temp.txt

可以看到,temp.txt文档中有3个制表符,其中一个位于字符串的开头,另外两个位于字符串之间,接着将该文本文档导入stata,并用空格(" ")将水平制表符替换为“X”

infix str25 v 1-200 using temp.txt,clear

replace v = ustrregexra(v," ","X")

compress

list

显然,处于字符串开头位置的制表符没有发生替换,而处于字符串之间的制表符用infix导入到stata之后,不同位置对应的空格数量也是不相同的,这是为什么呢?我们知道,制表符占的列数(即字节数)一定是8的整数倍,位于字符串“爬虫俱乐部”之后的制表符,其前边的字符串,即“爬虫俱乐部”已经占了15个字节的长度(笔者使用的是Stata15版本,每一个汉字占3个字节)。

因此其后的制表符应该占一个字节的位置,所以对应了一个空格,相应的替换为一个X;而位于字符串“将爬虫”之后的制表符,其前边的字符串“爬虫俱乐部X将爬虫”一共占了25个字节(8个汉字加上一个大写英文字母),因此这个制表符应该占7个字节的长度(32-25),对应7个空格,相应的被替换为7个“X”。

2

0

1

7

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

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


文字编辑/高金凤

技术总编/刘贝贝


往期推文推荐:



关于我们

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

投稿邮箱:statatraining@163.com

欢迎关注爬虫俱乐部

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