打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

     (由 R客 转载自 数据科学与R语言

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

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

word <- c('abc noboby@stat.berkeley.edu','text with no email','first me@mything.com also you@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
attr(,”match.length”)
[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('<td headers="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('<span class="year">',web)]movie.year <- substr(year,36,39)# 找到包含电影评分的行编号并进行提取score <- web[grep('<td headers="m_rating_score">',web)+1]movie.score <- substr(score,21,23)# 找到包含电影评价数量的行编号并进行提取rating <- web[grep('<td headers="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。

参考资料:Concepts in Computing with Data

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R语言中正则表达式
自学R语言(十三)-正则表达式的学习
useful R 字符串函数
R语言_符串处理和grep的用法
oracle PL/SQL使用更方便了——Oracle10g的SQL正则表达式支持[天源迪科论坛]
Oracle中的正则表达式(及函数)详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服