首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

正则表达式之空白元字符

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

往期回顾

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

本篇推文重点介绍一下制表符。制表符分为两种:水平制表符(\t)和垂直制表符(\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")

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

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

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

02

用infix导入temp.txt文件

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

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

replace v = ustrregexra(v,"\t","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

1

7

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

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

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

文字编辑/高金凤

技术总编/刘贝贝

关于我们

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

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

投稿要求:

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项:

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。

3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171212B0F6E200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券