在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" "女" "男" "女"
>