R语言-正则表达式

在R语言中使用正则表达式替换,可以使用sub()函数,用于全局替换则用gsub()函数。

1、例子

假设有一个字符串向量,需要将多字节文本过滤出来:

>a<-c("abc\x9422",'女','男','女')

如果直接对其使用大小写转换函数toupper(),则会报错:

> toupper(a)
Error in toupper(a) : 多字节字符串1有错

如何将该多字节字符去掉呢?假定它是读数据文件引入,没有意义的。

2、过滤步骤

思路:先将字符串向量转换为字符形式串,然后使用正则表达式替换,因为转换成字符串形式时,只能针对单个向量元素进行,故需要做一个函数,在使用lapply()作用于所有的向量元素。

(1)将字符串向量转换为字符串形式

> deparse(a)
[1] "c(\"abc\\x9422\", \"女\", \"男\", \"女\")"

(2)使用正则表达式替换,首先替换掉\"符号,然后再替换掉多字节字符(模式为:\x\d{2},也就是\x加两个字符)

sub("\\\"","",deparse(p))

sub("\\\\x\\d{2}",'',sub("\\\"","",deparse(p))

(3)封装成处理函数

b<-function(p){sub("\\\\x\\d{2}",'',sub("\\\"","",deparse(p))}

(4)将字符串处理函数应用到向量

lapply(a,FUN=b)

(5)将结果列表转换为向量
> unlist(lapply(a,FUN=b))
[1] "abc22" "女"    "男"    "女"

(6)完整的表达式

> b<-function(p){sub("\\\\x\\d{2}",'',sub("\\\"","",deparse(p))}

> a2<-unlist(lapply(a,FUN=b))
> a2

[1] "abc22" "女"    "男"    "女"   


> grep("[a-z]", letters)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
[25] 25 26
#参数value的使用


> grep("[a-z]", letters,value=TRUE)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r"
[19] "s" "t" "u" "v" "w" "x" "y" "z"
#将字符串的首字母转换为大写


> gsub("^(\\w)", "\\U\\1", "a test of capitalizing", perl=TRUE)
[1] "A test of capitalizing"
#将字符串中每个单词的首字母转换为大写


> gsub("\\b(\\w)", "\\U\\1", "a test of capitalizing", perl=TRUE)
[1] "A Test Of Capitalizing"


#对电子邮件地址进行匹配为例,用一个正则表达式来匹配电子邮件地址是一项很常见的任务。
>text<-c("ben@sina.com","kate@sina..com","ka...te@sina.com","kate@sina.12","kate@12.sina.com")
> text
[1] "ben@sina.com"     "kate@sina..com"   "ka...te@sina.com"
[4] "kate@sina.12"     "kate@12.sina.com"
> grep("(\\w+\\.)*\\w+@(\\w+\\.)+[a-zA-Z]+",text)
[1] 1 3 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值