专栏名称: 爬虫俱乐部
Stata技术控,编程技术咨询,数据讨论与分享,编程和实证培训。
目录
相关文章推荐
上海证券报  ·  吴清发文! ·  6 小时前  
上海证券报  ·  雷军预告:周四晚7点 ·  12 小时前  
上海证券报  ·  300543、002989,收警示函 ·  昨天  
证券时报  ·  售价217.7万元!飞行汽车起飞! ·  2 天前  
51好读  ›  专栏  ›  爬虫俱乐部

正则表达式之空白元字符

爬虫俱乐部  · 公众号  ·  · 2017-12-12 14:57

主要观点总结

本文主要介绍了制表符在文本和Stata中的表现,包括其在不同情境下的使用和转换。文章通过实例解释了制表符的特性及其在Stata中的导入和处理方式。

关键观点总结

关键观点1: 制表符的种类和作用

制表符分为水平制表符和垂直制表符,主要用于在文本中定位光标,方便编辑。水平制表符在终端和文件中的输出相当于按下键盘TAB键效果。

关键观点2: 制表符在Stata中的导入和处理

使用file命令导入制表符时,其可能变为n个连续的空格。使用fileread()函数或infix导入时,制表符的处理方式有所不同。infix读入后会自动将每一行开头和结尾的空格删除,而制表符位于字符串之间时,导入后可能变为不同数量的空格。

关键观点3: 制表符的替换和转换

可以使用元字符“ ”将水平制表符替换为其他字符,如“X”。同时,介绍了使用infix导入后制表符的处理方式以及如何用替换操作处理导入后的空格。


正文





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

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

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





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

往期回顾

之前的推文中,我们多次提到 “\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

0

1

7

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

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

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


文字编辑/高金凤

技术总编/刘贝贝


往期推文推荐:

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

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

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

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

5.







请到「今天看啥」查看全文