百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

在R语言中使用正则表达式

haoteby 2025-05-27 14:16 5 浏览

有时候我们要处理的是非结构化的数据,例如网页或是电邮资料,那么就需要用R来抓取所需的字符串,整理为进一步处理的数据形式。R语言中有一整套可以用来处理字符的函数,在之前的 博文 中已经有所涉及。但真正的要用好字符处理函数,则不得不用到正则表达式。 正则表达式(Regular Expression、regexp)是指一种用来描述一定数量文本的模式。熟练掌握正则表达式能使你随心所欲的操作文本来达成目标。其实学习正则表达式并没有想像中的那么困难。最好方法是从例子开始,然后多练习,多使用。网络上已经有许多不错的参考资料,例如 这篇 或 那篇 。本文假设你对正则表达式有了基本的了解,下面我们来看看如何在R里面来使用它。

假设我们有一个字符向量,包括了三个字符串。我们的目标是从中抽取电邮地址。R语言中很多字符函数都能识别正则表达式,而最重要的函数就是 gregexpr。该函数的第一个参数是正则表达式,前后需要用引号,对元字符进行转义时要用\\。第二个参数是等待处理的文本。那么用如下三行代 码,我们从word字符向量中得到一个列表,其中第一项元素中的5表示电邮地址从第5个字符位置开始,24表示电邮地址长度为24。

word <-c('abcnoboby@stat.berkeley.edu','textwithnoemail','firstme@mything.comalsoyou@yourspace.com')pattern<-'[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+'(gregout<-gregexpr(pattern,word))

[[1]]

[1] 5

attr(,”match.length”)

[1] 24

[[2]]

[1] -1

[[3]]

[1] 7 27

attr(,”match.length”)

[1] 14 17

下一步我们需要将电邮地址抽取出来,此时配合substr函数,即可根据需要字符串的位置来提取子集。

substr(word[1],gregout[[1]],gregout[[1]]+attr(gregout[[1]],'match.length')-1)

[1] “noboby@stat.berkeley.edu”

更方便的使用方式是根据上述方法建立一个自定义函数getcontent,参数s表示待处理的文本,参数g表示的是通过gregexpr函数处理后的结果。这个函数我们在后面还会用到。

getcontent <-function(s,g){substring(s,g,g+attr(g,'match.length')-1)}getcontent(word[1],gregout[[1]])

下面我们用一个较大的例子来说明在实际的数据抓取工作中,如何使用正则表达式。豆瓣电影是博主经常去的地方。此次任务目标是要抓取豆瓣电影中250部最佳电影的资料。R代码如下:

url<-'http://movie.douban.com/top250?format=text'# 获取网页原代码,以行的形式存放在web变量中web<-readLines(url,encoding="UTF-8")# 找到包含电影名称的行编号name<-web[grep('<tdheaders="m_name">',web)+1]# 用正则表达式来提取电影名
gregout <-gregexpr('>\\w+',name)
movie.names =0for(i in1:250){
    movie.names[i]<-getcontent(name[i],gregout[[i]])}
movie.names<-sub('>','',movie.names)# 找到包含电影发行年份的行编号并进行提取
year <-web[grep('<spanclass="year">',web)]
movie.year <-substr(year,36,39)# 找到包含电影评分的行编号并进行提取score<-web[grep('<tdheaders="m_rating_score">',web)+1]
movie.score <-substr(score,21,23)# 找到包含电影评价数量的行编号并进行提取rating<-web[grep('<tdheaders="m_rating_num">',web)+1]
movie.rating <-sub(' *','',rating)# 合成为数据框movie<-data.frame(names=movie.names,year=as.numeric(movie.year),score=as.numeric(movie.score),rate=as.numeric(movie.rating))# 绘散点图library(ggplot2)p<-ggplot(data=movie,aes(x=year,y=score))p+geom_point(aes(size=rate),colour='lightskyblue4',position="jitter",alpha=0.8)+geom_point(aes(x=1997,y=8.9),colour='red',size=4)

用散点图来观察数据,可以看到前250名电影中大部分是1980年之后发行的。1997年和2010年发行的电影有不少精品。而其中红色点所代表的是哪部电影你知道吗?那就是Titanic。

相关推荐

R数据分析:双因素方差分析与交互作用检验

Two-wayANOVAtestisusedtoevaluatesimultaneouslytheeffectoftwogroupingvariables(AandB)...

R数据分析:用R语言做meta分析

这里以我的一篇meta分析为例,详细描述meta分析的一般步骤,该例子实现的是效应量β的合并...

生存分析看完这篇就够了(R语言代码+线上工具)

尔云间一个专门做科研的团队云生信学生物信息学关注我们...

用R语言画图

R语言中离群值的识别、描述、绘制与移除

摘要:统计学中离群值被定义为离开大部分观测较远的样本点,多数是由于测量误差而产生。因此,数据分析中离群值的识别和移除(如有必要)是很重要的一个步骤。鉴定离群值的方法有很多种,包括基于标准差的方法和基于...

R语言、RStudio的下载、安装与使用

本文介绍R语言及其集成开发环境...

[R语言] R语言快速入门教程

本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门。主要参考文章:R-TutorialR语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码。但是R...

看完这个「R语言课程」合集,我发现R语言也不过如此…

小料君看到一个有趣的问答...

在R语言中使用正则表达式

有时候我们要处理的是非结构化的数据,例如网页或是电邮资料,那么就需要用R来抓取所需的字符串,整理为进一步处理的数据形式。R语言中有一整套可以用来处理字符的函数,在之前的博文中已经有所涉及。但真正的...

附代码|详解R语言的高级数据结构

有时数据需要比向量更复杂的存储方式。幸运的是,R软件提供了很多的数据结构。常见的有数据框(data.frame)、矩阵(matrix)、列表(list)以及数组(array)。数据框类似于电子表格,矩...

R语言实战—自学笔记—向量

第2章创建数据集2.1数据集的概念数据集:由数据构成的一个矩形数组,行表示观测,列表示变量。...

R语言从入门到精通:Day7

原创小浣熊科研猫是时候关注我们一波了在向reviewer或者导师展示自己的统计分析结果时,一张图往往顶得上千言万语;在刚接触到数据时,图也能帮助我们发现数据中潜在的模式或者其中的异常值,这两个例子...

一文教你学会维恩图的绘制——R语言

背景介绍维恩图用于展示在不同的事物群组(集合)之间的数学或逻辑联系,尤其适合用来表示集合(或)类之间的“大致关系”,它也常常被用来帮助推导(或理解推导过程)关于集合运算(或类运算)的一些规律。通常每个...

R语言介绍

一、R语言介绍...

R语言的一些常见初级基本操作

基本概念:在R语言里操作和接触的所有东西都称作对象(object)。对象有很多种类可以包含各种类型的数据。R语言里所有的东西都被称为对象,R语言中常见的数据类型有几下几种,分别是字符型(cha...