分享

useful R 字符串函数

 萌小芊 2018-04-05


R语言中有很多非常有用的函数,如果评有没有用实在是件比较艰难的事情,其实我们在之前也已经讲了很多有用的函数,但是都是比较简单的函数(简单但是常用),这里主要介绍一下和正则表达式相关的函数,没错,主要为了用于处理一些字符类的函数。

正则表达式(Regular Expression)是一种匹配检索模式,用于查询符合一定规则的字符,想了解更多可以百度搜索《正则表达式30分钟入门教程》,这分教程非常简单,但是正则表达式实在是天书,如果不是专门干这一项,了解一些基础的概念和常见的写法就可以了,比如什么叫元字符,什么叫转义等等。
首先经常碰到字符分裂类的问题,一般分为两种情况:按照固定字符分裂和按照固定长度分裂,前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂;

字符串分裂:按字符分裂
mystring <- '前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂'strsplit(mystring, split = '字符',perl = T) # 固定字符strsplit(mystring, split = '字符|进行',perl = T) mystring <- c('前者表示指定一个分裂字符串','当字符串中出现该固定模式时就进行分裂', '后者表示每隔多少个字符进行分裂')strsplit(mystring, split = '字符|进行', perl= T)

1行创建一个字符串对象,2行使用基础的strsplit函数指定字符切分,第一个参数指定被切分的对象,第二个参数指定切分的字符,perl参数指定正则表达式是否perl语言兼容,其实split用来指定一个正则表达式,只不过这里的模式比较简单就是按字符切分;3句使用了一个正则表达式中“或”模式,指定当碰到“字符”或“进行”进行切分,“|”在正则表达式或R中都是“或”的意思;

字符串分裂:按固定长度分裂
mystring <- '前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂'strsplit(mystring, split ='(?<=.{3})', perl = T) substr(mystring, start = 1, stop = 3)startpoint <- seq(1, nchar(mystring)-1,3)stoppoint <- seq(2, nchar(mystring), 3)substring(mystring, startpoint, stoppoint)

2行使用了一个比较难懂的正则表达式,“?<=.{3}”表示匹配任意三个字符后面的字符,外面的英文小括号表示分组提取,这样split函数就有了分裂的依据,然后就可以得到按3个字符长度分裂的结果,当然你也可以改成任意一个字符长度,如果你看不懂,不要急下面提供另外一种方法;3行使用substr函数获取指定位置的字符,第二个参数指定字符的起始位置,第三个参数指定字符的结束位置,整体来说提取字符串的第一个到第三个字符(包括第一和第三),我们将substr稍加改造j就可以用于固定长度分割;4行seq生成一个等差数列向量,向量从1开始,到字符串mystring的字符数减去1结束,nchar用于获取字符串的字符数,数列的公差是3,也就是说每隔三个字符;5行生成另外一个等差数列,数列的起始位置为上一个数列的公差,这里是准备按照3个字符分割,所以其实位置为3,结束位置为字符串的字符数,公差仍然是2;6行将startpoint和stoppoint赋值给函数substr的参数即可完成按3个字符长度的分割。

字符串查找替换
mystring <- '前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂'grepl('字符', mystring,perl = T)gsub('字符','b', mystring, perl = T)

经常需要查看一个字符串中是否包含某种模式的字符,比如2行使用grepl函数搜索字符串中是否包含“字符”,grep是global search regular expression的缩写,而l表示logic,也就是说grepl返回的是一个逻辑值;3行gsub函数用于查找某种模式并替换另外一种模式,这里将“字符”替换为“b”。

在数据抓取的任务中我们经常碰到数据提取,但通常又不知道模式的起始范围,那就只能用函数指定一个模式去查找模式的起始位置,regexpr函数就完成这样的任务

模式查询函数
mystring <- '前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂'y <- regexpr('前者.*后者',mystring, perl = TRUE)yz <- y + attr(y, which ='match.length') - 1substr(mystring, start = y, stop = z)

regexpr函数用于查找模式的起始位置和模式的长度。比如正则表达式前者.*后者表示以“前者”开始且以“后者”结束,中间任意多个任意字符的模式。regexpr函数第一个参数用于指定正则表达式模式,第二个参数指定数据,第三个参数用于设置时候兼容perl模式,regexpr函数返回的是模式之前有多少个字符,并且以属性(attr)的方式返回模式本身有多长(match.length),使用attr函数可以提取向量的属性,这样我们有了模式的起始位置加上模式的长度就很容易算出模式的结束位置,有了起始和结束很容易就可以提取模式了。2行查询模式;3行查看查询结果,看到结果有一个叫做match.length的属性;4行计算结束位置attr函数用于提取属性,因为对象可能有多个属性,所以which参数用于指定属性的名称;5行就可以按照起始和结束位置提取字符了。

模式查询函数:多次匹配
mystring <- '前者表示指定一个分裂字符串,当字符串中出现该固定模式时就进行分裂;后者表示每隔多少个字符进行分裂'm <- gregexpr('字符',mystring, perl=TRUE)regmatches(mystring, m)

regexpr函数仅能匹配第一个出现的模式,但有时候要匹配出字符串中所有符合的模式,这里就需要gregexpr函数出场了,它和regexpr函数返回的结果一样,只不过它匹配多次,另外为了替换substr函数,这里使用了regmatches函数,用于提取匹配到的模式,它会根据gregexpr函数的结果自动计算模式的起止位置,然后提取模式。

想了解更多关于字符和正则表达式的函数,可以输入“?gsub”查看帮助文档,你可以看到和正则表达式相关的很多个函数,不必每个都记住,但是需要记住他们都有相同的参数,第一个参数是指定模式,第二个x参数指定数据,x可以是单个字符串,也可以是一个字符串向量,换句话说这些函数都能进行向量计算,一次批量处理多个字符串,同时也推荐stringr包,一个专门用来做字符处理的R包。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多