R语言 | 关于正则表达式的两个使用体会

Posted R语言与SPSS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言 | 关于正则表达式的两个使用体会相关的知识,希望对你有一定的参考价值。



我就在这里等你关注,不离不弃

——A·May

Re-1 |T-151

分享一下用正则表达式的感受,算是对正则的小总结,不是很专业,仅供参考。

May

2018年4月29日

library(RCurl)
## Loading required package: bitops
library(XML)
library(tidyverse)
## -- Attaching packages ---------------------------------- tidyverse 1.2.1 --
## √ ggplot2 2.2.1     √ purrr   0.2.4
## √ tibble  1.4.2     √ dplyr   0.7.4
## √ tidyr   0.7.2     √ stringr 1.2.0
## √ readr   1.1.1     √ forcats 0.2.0
## -- Conflicts ------------------------------------- tidyverse_conflicts() --
## x tidyr::complete() masks RCurl::complete()
## x dplyr::filter()   masks stats::filter()
## x dplyr::lag()      masks stats::lag()
library(rlist)
imdb_url <- 'https://www.imdb.com/chart/top'
#请求到网页html文件
top <- getURL(imdb_url)
#解析html文件
parse_top <- htmlParse(top,encoding = 'UTF-8')
#读表
top_table <- readHTMLTable(parse_top)

R语言 | 关于正则表达式的两个使用体会


#列表分为两层,我们分别打开
top_table1  %>%`[[`(1) top_table2  %>%`[[`(2)
#需要第一层的列表
top_f <- top_table1[,2:3]
#一波清洗,正则表达式绝对不是一次可以写完的!
head(top_f,3)
##                   Rank & Title     IMDb Rating
## 1 1.\n      The Shawshank Redemption\n        (1994)         9.2
## 2            2.\n      The Godfather\n        (1972)         9.2
## 3   3.\n      The Godfather: Part II\n        (1974)         9.0
#清洗:1将年份提取出来;2去除掉空格和\n#没有年份的变量,所以新建变量
#按正则进行提取对应的内容,不是对应的行内容,用str_extract_all#年份是用[0-9]数字,{4}表示一共有四个数字#如下:结果是列表,需要转为向量
head(top_f$year <- str_extract_all(top_f$`Rank & Title`,"[0-9]{4}"),4)
## [[1]]
## [1] "1994"
## 
## [[2]]
## [1] "1972"
## 
## [[3]]
## [1] "1974"
## 
## [[4]]
## [1] "2008"
#用unlist,发现出错了,因为发现有一条信息有两个年份,这就很奇怪
top_f$year <- rank="">%unlist

R语言 | 关于正则表达式的两个使用体会

#多列的list就需要改用list.rbind进行向量化,下面的操作到data.frame就可以模式化了
top_f$year <- str_extract_all(top_f$`Rank & Title`,"[0-9]{4}")%>%list.rbind()%>%data.frame()%>%.$X1
#查看记录,已经可以了
head(top_f$year,3)

## [1] 1994 1972 1974
## 84 Levels: 1921 1924 1925 1926 1927 1928 1931 1934 1936 1939 1940 ... 2049
#处理第一列,处理掉第一段的字符#\n 的正则写法用[\\n],()的写法用[()],年份的写法用[0-9]{4},序号从1到250对应的写法用[0-9]{1,3}
top_f$`Rank & Title` <- str_replace_all(top_f$`Rank & Title` ,"[\\n]|[()]|[0-9]{4}|[0-9]{1,3}.","")%>%str_trim(side="both")
#结果已经OK
head(top_f$`Rank & Title`,3)
## [1] "The Shawshank Redemption" "The Godfather"           
## [3] "The Godfather: Part II"
#对结果用year的降序进行整理
top_ff <->%arrange(desc(as.character(year)))
#我天,还有2049年的,肯定是哪出错了,没注意到.当然,这次重在用正则,内容先忽略
head(top_ff)
##              Rank & Title              IMDb Rating year
## 1            Blade Runner               8.1 2049
## 2     Avengers: Infinity War                8.9 2018
## 3              Coco                     8.4 2017
## 4 Three Billboards Outside Ebbing, Missouri      8.2 2017
## 5                     Logan         8.1 2017
## 6                   Dangal         8.3 2016
library(rlist)
#对于正则表达式,我的观点是:
#那个表 是用来理解和用的时候查的!!!! 别费时间在那上面,过目不忘的请忽略
#然后,其实用到正则的概率不多,毕竟我们又不是用正则来做爬虫,所以了解基础的就好
#之前被字符困扰,现在摸索的是这样的:
#标点符号用下面的方式解决,虽然有点麻烦
#我的这个写法就是,需要删除什么就一点一点删除,需要批量处理的时候再对应附录去找\d\D\s\S等
c <- "我是一个坏 人9527wc()    .?-=+\n,/"
#无效写法:删除括号
c%>%str_replace_all("()","")
## [1] "我是一个坏 人9527wc()    .?-=+\n,/"
#有效写法:删除括号
c%>%str_replace_all("[()]","")
## [1] "我是一个坏 人9527wc    .?-=+\n,/"
#处理空格:正常空格一般是一个,非正常的一般是2个以上,所以写法是[ ]{2,},[]里面有一个空格
c%>%str_replace_all("[()]|[ ]{2,}","")
## [1] "我是一个坏 人9527wc.?-=+\n,/"
library(jiebaRD)
library(jiebaR)
#关于文字的写法,就如上次的科学研究方法中的
rs <- read.csv("rways.csv") head(rs)
##   X      id grade             title    major
## 1 1 2121673  12级  网络内容服务商竞争行为的演化博弈分析  信息管理
## 2 2 2131636  13级          《明史·艺文志》“易”类书目研究   图书馆
## 3 3 2131636  13级          《明史·艺文志》“易”类书目研究   图书馆
## 4 4 2141589  14级   《孙子兵法》对竞争情报工作的启示研究 信息管理
## 5 5 2141589  14级   《孙子兵法》对竞争情报工作的启示研究 信息管理
## 6 6 2141589  14级   《孙子兵法》对竞争情报工作的启示研究 信息管理
##      majorways      easyornot innovation useornot
## 1 演化博弈模型 经过学习可掌握         有     不会
## 2   文献分析法       已经掌握         有       会
## 3   统计分析法 经过学习可掌握         有       会
## 4   文献综述法       已经掌握         无       会
## 5 跨学科研究法 经过学习可掌握         有       会
## 6   案例分析法 经过学习可掌握         有     不会
#包含英文的研究方法#第一步,写正则,包含英文的研究方法,即.*[a-zA-Z].*   # .* 表示 有任意字符任意数量
#其余步骤同上
s4 <- str_extract_all(rs$majorways,".*[a-zA-Z].*")%>%unlist()%>%str_replace_all("\\s","")%>%unique() s4
## [1] "DEMATEL法"        "PEST分析法"       "AHP-TOPSIS相结合"
## [4] "SPSS统计分析法"   "SWOT分析法"

学习数据挖掘交流平台 

长按二维码识别


以上是关于R语言 | 关于正则表达式的两个使用体会的主要内容,如果未能解决你的问题,请参考以下文章

R语言之正则表达式

R语言学习13-正则表达式

答果子问R语言如何用正则表达式提取特定的字符串

正则表达式匹配 PHP 注释

干货收藏 | R语言之正则表达式

请问怎么用R语言正则表达式统计文章的单词数和中文字数,不能用程序包?