R语言之grep函数和正则通配符查询

在R语言的道路上又学到了一个新知识,记下来一起分享!

首先,grep函数可以像数据库查询一样对向量中的具有特定条件的元素进行查询!

其次,介绍几种R语言中的正则通配符:

(1)“^”匹配一个字符串的开始,比如sub("^a","",c("abcd","dcba")),表示将开头为a的字符串。如果要将开头的一个字符串替换,简单地写成“^ab”就行。

> Num <- c(310,456,311,431,421,435,534,312,313,320,321,322,323,314,324,317,3231)
> ipn<-grep("^3",Num,value=T)##开头为3的数字##
> ipn
 [1] "310"  "311"  "312"  "313"  "320"  "321"  "322"  "323"  "314"  "324"  "317"  "3231"

(2)“$”匹配一个字符串的结尾,比如sub("a$","",c("abcd","dcba"))表示将以a结尾的字符串。

> ipn<-grep("4$",Num,value=T)##以4结尾的的数字#
> ipn
[1] "534" "314" "324"

(3)"."表示除了换行符以外的任一字符,比如sub("a.c","",c("abcd","sdacd"))。

> ipn<-grep("3.2",Num,value=T)##所有以3开头,以2结尾的数字##
> ipn
[1] "312" "322"

(4)“*”表示将其前的字符进行0个或多个的匹配,比如sub("a*b","",c("aabcd","dcaaaba"))。

> ipn<-grep("3*1",Num,value=T)##所有开头为3或者末位为1的数字##
> ipn
 [1] "310"  "311"  "431"  "421"  "312"  "313"  "321"  "314"  "317"  "3231"

(5)“?”匹配0或1个正好在它之前的那个字符.

> ipn<-grep("?31",Num,value=T)##所有含‘31’的数字##
> ipn
[1] "310"  "311"  "431"  "312"  "313"  "314"  "317"  "3231"

(6)“+”匹配1或多个正好在它之前的那个字符。

> ipn<-grep("+31",Num,value=T)##所有含‘31’的数字##
> ipn
[1] "310"  "311"  "431"  "312"  "313"  "314"  "317"  "3231"

(7)“.*”可以匹配任意字符,比如sub("a.*e","",c("abcde","edcba"))。

> ipn<-grep("3.*1",Num,value=T)##所有含‘3'和'1’的数字##
> ipn
[1] "310"  "311"  "431"  "312"  "313"  "321"  "314"  "317"  "3231"

(8)“|”表示逻辑的或,比如sub("ab|ba","",c("abcd","dcba")),可以替换ab或者ba。

> ipn<-grep("3|1",Num,value=T)##所有含‘3'或'1’的数字##
> ipn
 [1] "310"  "311"  "431"  "421"  "435"  "534"  "312"  "313"  "320"  "321"  "322"  "323"  "314" 
[14] "324"  "317"  "3231"

(9)“^”还可以表示逻辑的补集,需要写在“[]”中,比如sub("[^ab]","",c("abcd","dcba")),由于sub只替换搜寻到的第一个,因此这个例子中用gsub效果更好。

> ipn<-grep("[1]",Num,value=T)##所有含‘1’的数字##
> ipn
 [1] "310"  "311"  "431"  "421"  "312"  "313"  "321"  "314"  "317"  "3231"

(10)“[]”还可以用来匹配多个字符,如果不使用任何分隔符号,则搜寻这个集合,比如在sub("[ab]","",c("abcd","dcba"))中,和"a|b"效果一样。

(11)“[-]”的形式可以匹配一个范围,比如sub("[a-c]","",c("abcde","edcba"))匹配从a到c的字符,sub("[1-9]","",c("ab001","001ab"))匹配从1到9的数字。

    最后需要提一下的是“贪婪”和“懒惰”的匹配规则。默认情况下是匹配尽可能多的字符,是为贪婪匹配,比如sub("a.*b","",c("aabab","eabbe")),默认匹配最长的a开头b结尾的字串,也就是整个字符串。如果要进行懒惰匹配,也就是匹配最短的字串,只需要在后面加个“?”,比如sub("a.*?b","",c("aabab","eabbe")),就会匹配最开始找到的最短的a开头b结尾的字串。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值