R语言中的正则表达式
这篇博客是对R语言中的正则表达式进行的整理,以实际应用为主,主要用于学习备忘,后续会根据需要进行补充。常用函数部分仅给出部分示例,详细使用方式可以使用R的帮助函数查询。
1、语法规则
常用符号及含义
符号 | 含义 |
---|---|
\ | 转义字符 |
. | 除了换行以外的任意字符 |
^ | 放在句首,表示一行字符串的起始 |
$ | 放在句尾,表示一行字符串的结束 |
* | 零个或者多个之前的字符 |
+ | 一个或者多个之前的字符 |
? | 零个或者一个之前的字符 |
[] | 匹配其中任何一个字符,而^在[]中代表“非”, -代表“之间” |
| | 或者,小括号()与花括号{}配合“|”使用 |
常用特殊转义字符含义
转义字符 | 含义 |
---|---|
\n | 换行符 |
\t | 制表符 |
\w | 任意字母(包括下划线)或者数字 即 [a-zA-Z0-9_] |
\W | \w的反义 即[^a-zA-Z0-9_] |
\d | 任意一个数字 即[0-9] |
\D | \d的反义 即[^0-9] |
\s | 任意一个空格,比如space, tab, newline 等 |
\S | \s的反义,任意一个非空格 |
2、常用函数
2.1 grep和grepl函数
这两个函数返回向量水平的匹配结果,不涉及匹配字符串的详细位置信息。其中,grep仅返回匹配项的下标,而grepl返回所有的查询结果,并用逻辑向量表示有没有找到匹配。两者的结果用于提取数据子集的结果都一样。
示例:列出C:\windows目录下的所有文件,然后用grep和grepl查找exe文件
> files <- list.files("c:/windows")
> grep("\\.exe$", files) [1] 8 28 30 35 36 57 68 98 99 101 110
> grepl("\\.exe$", files) [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE[11] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE> files[grep("\\.exe$", files)] [1] "bfsvc.exe" "explorer.exe" "fveupdate.exe" "HelpPane.exe" [5] "hh.exe" "notepad.exe" "regedit.exe" "twunk_16.exe" [9] "twunk_32.exe" "uninst.exe" "winhelp.exe"
> files[grepl("\\.exe$", files)] [1] "bfsvc.exe" "explorer.exe" "fveupdate.exe" "HelpPane.exe" [5] "hh.exe" "notepad.exe" "regedit.exe" "twunk_16.exe" [9] "twunk_32.exe" "uninst.exe" "winhelp.exe"
2.2 regexpr、gregexpr和regexec
这三个函数返回的结果包含了匹配的具体位置和字符串长度信息,可以用于字符串的提取操作。
> text <- c("Hellow, Adam!", "Hi, Adam!")
> regexpr("Adam", text)
[1] 9 5
attr(,"match.length")
[1] 4 4
attr(,"useBytes")
[1] TRUE
> gregexpr("Adam", text)
[[1]]
[1] 9
attr(,"match.length")
[1] 4
attr(,"useBytes")
[1] TRUE
[[2]]
[1] 5
attr(,"match.length")
[1] 4
attr(,"useBytes")
[1] TRUE
> regexec("Adam", text)
[[1]]
[1] 9
attr(,"match.length")
[1] 4
[[2]]
[1] 5
attr(,"match.length")
[1] 4
2.3 sub和gsub
sub和gsub的区别是前者只做一次替换(不管有几次匹配),而gsub把满足条件的匹配都做替换。虽然sub和gsub是用于字符串替换的函数,但严格地说R语言没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址。
> sub(pattern="Adam|Ava", replacement="world", text)
[1] "Hello world!\nHello Ava!"
> gsub(pattern="Adam|Ava", replacement="world", text)
[1] "Hello world!\nHello world!"
3、stringr包中实现正则表达的函数
3.1 str_detect
str_detect函数用于检测字符向量中是否存在匹配模式,返回逻辑值。
> some_objs = c("pen", "pencil", "marker", "spray")
> str_detect(some_objs, "pen")
[1] TRUE TRUE FALSE FALSE
3.2 str_extract和str_extract_all
str_extract函数的功能是剥离文本向量中每个元素中哦哦那个第一个匹配的值,无匹配的元素返回NA,结果是一个和文本向量同等维度的向量;str_extract_all功能类似str_extract,但是它会剥离文本向量中每个元素中所有符合匹配模式的值,无匹配时返回character(0),结果格式为list格式。
> paris_tweets = c("#Paris is chock-full of cultural and culinary attractions", "Some time in #Paris along Canal St.-Martin famous by #Amelie", "While you're in #Paris, stop at cafe: http://goo.gl/yaCbW", "Paris, the city of light")
> hash = "#[a-zA-Z]{1,}"
> str_extract(paris_tweets, hash)
[1] "#Paris" "#Paris" "#Paris" NA
3.3 str_match和str_match_all
较str_extract和str_extract_all,str_match和str_match_all会给出详细的匹配信息。
> str_match(strings, dates)[,1] [,2] [,3] [,4]
[1,] "12 Jun 2002" "12" "Jun" "2002"
[2,] "8 September 2004" "8" "September" "2004"
[3,] "22-July-2009" "22" "July" "2009"
[4,] NA NA NA NA
... ...> str_match_all(paris_tweets, hash)
[[1]][,1]
[1,] "#Paris"[[2]]
... ...
3.4 str_locate和str_locate_all
这两个函数是用于定位匹配模式在文本向量每个元素中的位置,同上前者只定位第一个出现的匹配模式,后者针对所有匹配的模式;str_locate返回的是两列的矩阵,str_locate_all返回的是list。
> str_locate(paris_tweets, hash)start end
[1,] 1 6
[2,] 14 19
[3,] 17 22
[4,] NA NA> str_locate_all(paris_tweets, hash)
[[1]]start end
[1,] 1 6[[2]]
... ...
3.5 str_replace和str_replace_all
这两个函数用于替换,用指定模式替换匹配模式。
> cities = c("San Francisco", "Barcelona", "Naples", "Paris")
> str_replace(cities, "[aeiou]", ";")
[1] "S;n Francisco" "B;rcelona" "N;ples" "P;ris"> str_replace_all(cities, pattern = "[aeiou]", ";")
[1] "S;n Fr;nc;sc;" "B;rc;l;n;" "N;pl;s" "P;r;s"
3.6 str_split和str_split_fixed
str_split语法形如: str_split(string, pattern, n=Inf),其中n是返回的分割数目;str_split_fixed函数同样用于分割,其语法格式为:str_split_fixed(string, pattern, n),这里n没有默认值,必须指定。
> sentence = c("R is a collaborative project with many contributors")
> str_split(sentence, " ")
[[1]]
[1] "R" "is" "a" "collaborative"
[5] "project" "with" "many" "contributors"> flavors = c("chocolate", "vanilla", "cinnamon", "mint", "lemon")
# 以n为界分割为两部分
> str_split_fixed(flavors, "n", 2)[,1] [,2]
[1,] "chocolate" ""
[2,] "va" "illa"
[3,] "ci" "namon"
[4,] "mi" "t"
[5,] "lemo" ""
参考链接:
http://www.thebigdata.cn/JiShuBoKe/13826.html
http://blog.163.com/yugao1986@126/blog/static/692285082014325113834380/
http://blog.163.com/shen_960124/blog/static/60730984201411184587551/
R语言中的正则表达式相关推荐
- R语言中使用pkgbuild::find_rtools查看是否有Rtools、使用Sys.which函数查看make是否存在、如果没有则安装、使用writeLines函数绑定R和Rtools
R语言中使用pkgbuild::find_rtools(debug = TRUE)查看是否有Rtools.使用Sys.which函数查看make是否存在.如果没有则安装Rtools.使用writeLi ...
- R语言中如何计算C-Statistics?几种计算方法详解
R语言中如何计算C-Statistics?几种计算方法详解 目录 R语言中如何计算C-Statistics? #包导入 #数据加载编码
- C语言中嵌入正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...
- r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf
注: 本文是R语言sf包的核心开发者和维护者--来自德国明斯特大学的地理信息学教授:Edzer Pebesma 的一篇关于sf包的简介,发表于2018年7月的R语言期刊,主要讲述了sf的定位.功能. ...
- 在linux下,如何在C语言中使用正则表达式
http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...
- R语言中的特殊值 NA NULL NaN Inf
这几个都是R语言中的特殊值,都是R的保留字, NA:Not available 表示缺失值 用 is.na() 来判断是否为缺失值 NULL:表示空值,即没有内容 用 is.null() 来判 ...
- R开发(part8)--应用R语言中的函数环境空间
学习笔记,仅供参考,有错必纠 文章目录 R开发 应用R语言中的函数环境空间 R语言的函数环境空间 封闭环境 绑定环境 运行环境 调用环境 函数环境空间图示 R开发 应用R语言中的函数环境空间 R语言的 ...
- R开发(part2)--R语言中的数学计算
学习笔记,仅供参考,有错必纠 参考自:<R的极客理想>-- 张丹 文章目录 R开发 R语言中的数学计算 对数 加权平均.连乘.差分.秩.任意数.全体数 阶乘.组合.排列 累加.累乘.最小累 ...
- r语言中正定矩阵由于误差不正定_R语言之数据处理(一)
在上一篇小文中,提到了关于R语言导入数据的一些方法,之后的重点就转向了数据的处理上.数据处理其实在整个数据分析项目中所占用的时间是比较多的,所以根据处理的目的不同,也有不同的处理方法.在R语言中,我通 ...
最新文章
- MPEG-7 视觉描述符
- 2017-2018-1 20155231 《信息安全系统设计基础》第6周学习总结
- [JOI2012春季合宿]Constellation (凸包)
- 本地java【动态监听】zk集群节点变化
- CodeForces 176A Trading Business 贪心
- 【数字图像处理】傅里叶变换在图像处理中的应用
- windows installer没有正确安装_电脑还可以这样禁止软件自动安装,后悔知道得太晚...
- mysql存储过程删除_MySQL 存储过程删除大表
- 【Linux】Windows 10 安装应用商店 ubuntu 终端后访问本地文件
- 【openwrt】初探 基于MT7621
- 主流加密方式和工具比较
- Java 进制转换函数
- 图像处理系列——直方图之灰度直方图(Image Histogram)
- 解决Ubuntu18.04和Win10双系统系统时间不对的问题
- 虚拟机修改ip地址的操作步骤
- JS日历控件 (兼容IE firefox) 可选择时间
- 如何快速获得Q币(python简单实现)
- Halo CMS项目改成用Maven构建项目并打包成安装程序
- 转:查理·芒格:让打击和麻烦成为成长的契机
- 全网最通俗易懂的「插屏广告」接入方法