• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

R语言之正则表达式

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在我看来,正则表达式的主要用途有两种:①查找特定的信息②查找并编辑特定的信息,也就是我们经常用的替换。。比如我们要在Word,记事本等里面使用快捷键Ctrl+F,进行查找一个特定的字符,或者替换一个字符,这就使用了正则表达式。

  正则表达式的功能非常强大,尤其是在文本数据进行处理中显得更加突出。R中的grep、grepl、sub、gsub、regexpr、gregexpr等函数都使用正则表达式的规则进行匹配。这几个函数原型如下:

grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,  
     fixed = FALSE, useBytes = FALSE, invert = FALSE)  
  
grepl(pattern, x, ignore.case = FALSE, perl = FALSE,  
      fixed = FALSE, useBytes = FALSE)  
  
sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,  
    fixed = FALSE, useBytes = FALSE)  
  
gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,  
     fixed = FALSE, useBytes = FALSE)  
  
regexpr(pattern, text, ignore.case = FALSE, perl = FALSE,  
        fixed = FALSE, useBytes = FALSE)  
  
gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,  
         fixed = FALSE, useBytes = FALSE)  
  
regexec(pattern, text, ignore.case = FALSE, perl = FALSE,  
        fixed = FALSE, useBytes = FALSE)  

  

这里是对参数进行一个解释说明。

 

参数

说明

pattern

正则表达式

x, text

字符向量或字符对象,在R 3.0.0后版本中,最大支持超过2^31个的字符元素。

ignore.case

默认FALSE,表示区分大小写,TRUE时表示不区分大小写。

perl

是否使用Perl兼容的正则表达式

value

默认为FALSE,当查找到时返回1,否则返回0;当为TRUE查找到时返回整个x,text,否则返回0。

fixed

如果为TRUE,pattern是要匹配的字符串。覆盖所有冲突的参数

useBytes

默认为false,当为true时,则是逐字节逐字节匹配而不是逐字符逐字符匹配。

invert

如果TRUE返回不匹配的元素的索引或值。

replacement

如果查找到之后,进行替换,若没有找到,则返回x,text值

 

 


接下来我们对这几个函数谈谈他们的不同点。

 

 

函数

作用

grep()

查找,存在参数value,返回结果是匹配项的下标

grepl()

查找,返回值为true

sub()

只对查找到的第一个内容进行替换。(同下)

gsub()

对查找到的所有内容进行替换,返回替换后的text;否则直接返回text

regexpr()

返回一个与给出第一个匹配的起始位置的文本长度相同的整数向量,如果没有则返回-1, “match.length”给出匹配文本长度的整数向量(或-1)。匹配位置和长度为字符。

除了regexec,目前不支持Perl风格()的正则表达式。

。useBytes的主要效果是避免关于多字节语言环境中的无效输入和伪匹配的错误/警告,但对于regexpr,它会更改输出的解释。它禁止具有标记编码的输入的转换,并且如果发现任何输入被标记为“字节”,则被强制参见编码)。

无关匹配对多字节语言环境中的字节没有多大意义,如果useBytes = TRUE,您应该希望它只适用于ASCII字符。

regexpr和gregexpr与perl = TRUE允许Python风格的命名捕获,但不是长矢量输入。

当前语言环境中的无效输入最多警告5次。

对于非ASCII字符,与PERL = TRUE的无符号匹配取决于使用“Unicode属性支持”编译的PCRE库:外部库可能不是。

如果你正在做很多的正则表达式匹配,包括非常长的字符串,通常将正则表达式引擎设为PCRE,这将将比默认正则表达式引擎快,而fixed = TRUE更快(特别是当每个模式只匹配几次时)。

 

gregexpr()

返回一个与文本长度相同的列表,每个元素的格式与regexpr的返回值相同,除了给出了每个(不相交)匹配的起始位置。

regexec()

返回与文本相同长度的列表,如果没有匹配,则返回-1,或者具有匹配的起始位置的整数序列和对应于模式的括号子表达式的所有子串,其中属性“match .length“给出匹配长度的向量(或没有匹配的-1)。

 

 

     下面是我对正则表达式转义字符的一些总结,但R语言里面grep、grepl、sub、gsub、regexpr、gregexpr这几个函数并不支持使用 “\” 进行转义。

 

正则表达式转义字符
空白元字符 [\b] 回退(并删除)一个字符(backspace)
\f 换页符
\n 换行符
\r 回车符
\t 制表符(tab)
\v 垂直制表符
注:\r\n是windows所用的文本行结束符,Unix和Linux只是用一个换行符来结束一个文本行
匹配数字与非数字 \d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于^[0-9]
匹配字母\非字母与数字 \w 任何一个字母数字字符(大小写均可以)或下划线字符(等价于[a-zA-Z0-9])
\W 任何一个非字母数字或下划线字符(等价于[^a-zA-Z0-9])
匹配空白字符 \s 任何一个空白字符(等价于[\f\n\r\t\v])
\S 任何一个非空白字符(等价于[^\f\n\r\t\v])
POSIX字符类 [:alnum:] 任何一个字母或数字(等价于[a-ZA-Z0-9])
[:alpha:] 任何一个字母(等价于[a-ZA-Z])
[:blank:] 空格或制表符(等价于[\t ])    注:t后面有一个空格
[:cntrl:] ASCII控制字符(ASCII 0到31,再加上ASCII 127)
[:digit:] 任何一个数字(等价于[0-9])
[:graph:] 和[:print:]一样,但不包括空格
[:lower:] 任何一个小写字母(等价于[a-z])
[:print:] 任何一个可打印字符
[:punct:] 既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符
[:space:] 任何一个空格字符,包括空格(等价于[f\n\r\t\v ] 注:v后面有一个空格
[:upper:] 任何一个大写字母(等价于[A-Z])
[:xdigit:] 任何一个十六进制数字(等价于[a-fA-F0-9])
其他 . 可以匹配任何单个的字符字母数字甚至.字符本身。同一个正则表达式允许使用多个.字符。但不能匹配换行
\\ 转义字符,如果要匹配就要写成“\\(\\)”
| 表示可选项,即|前后的表达式任选一个
^ 取非匹配
$ 放在句尾,表示一行字符串的结束
() 提取匹配的字符串,(\\s*)表示连续空格的字符串
[] 选择方括号中的任意一个(如[0-2]和[012]完全等价,[Rr]负责匹配字母R和r)
{} 前面的字符或表达式的重复次数。如{5,12}表示重复的次数不能小于5,不能多于12,否则都不匹配
* 匹配零个或任意多个字符或字符集合,也可以没有匹配
+ 匹配一个或多个字符,至少匹配一次
? 匹配零个或一个字符

 

 

现在来举几个例子。

首先使用[]中括号的功能,来查找一下看有没有do组合的单词。

text<-c("Don\'t","aim","for","success","if","you","want","it","just","do","what","you","love",  
        "and","believe","in","and","it","will","come","naturally")  
  
#查找含有DO组合的单词  
grep("[Dd]o",text)#不区分大小写  
grep("[D]o",text)#D要大写  
grep("[d]o",text)#D小写  

  运行结果如下:

> text<-c("Don\'t","aim","for","success","if","you","want","it","just","do","what","you","love",  
+         "and","believe","in","and","it","will","come","naturally")  
>   
> #查找含有DO组合的单词  
> grep("[Dd]o",text)#不区分大小写  
[1]  1 10  
> grep("[D]o",text)#D要大写  
[1] 1  
> grep("[d]o",text)#D小写  
[1] 10  

    邮箱匹配:

#邮箱匹配:  
text2<-c("[email protected] is my email address.")  
grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)  

  

> text2<-c("[email protected] is my email address.")  
> grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)  
[1] TRUE  

  

可以已经查找邮箱的。


关注《跟着菜鸟一起学R语言》回复 正则表达式必知必会 即可获取下载链接。

 

转载请注明原文csdn链接:http://blog.csdn.NET/wzgl__wh/article/details/52938475


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
你被R语言的=和 -搞昏了头吗发布时间:2022-07-18
下一篇:
R语言-光学字符识别分析SVM发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap