查找并替换R

时间:2015-06-19 19:54:18

标签: regex r replace

我正在寻找一种方法来使用R中的查找和替换函数来替换字符串的整个值,而不仅仅是字符串的匹配部分。我有一个包含很多(非常)长名称的数据集,我正在寻找一种有效的方法来查找和更改它们的值。

所以,例如,我试图改变整个字符串

string <- "Generally.speaking..do.you.prefer.to.try.out.new.experiences.like.trying.things.and.meeting.new.people..or.do.you.prefer.familiar.situations.and.faces."

"exp"

使用此代码

string <- gsub("experiences", "exp", string)

但是,这会导致替换&#34; exp&#34;只有匹配&#34;体验&#34;的字符串部分,并且它保留了长名称的其余部分(为了清晰起见,加粗):

  

&#34; Generally.speaking..do.you.prefer.to.try.out.new的 EXP .. like.trying.things.and.meeting.new.people。 .or.do.you.prefer.familiar.situations.and.faces&#34;

在这种情况下,由于字符串包含&#34;体验&#34;,因此应将其替换为&#34; exp。&#34;

有没有办法告诉gsub或其他一些函数来替换整个值?我看了很多教程,看起来函数只能在字符串或整个值中运行,但不能在两者之间运行。

4 个答案:

答案 0 :(得分:5)

由于您知道所需的值(“exp”),因此无需使用gsub修改字符串。

s = c(string,"bah","egad.experiences")

replace(s,grep("experiences",s),"exp")
# [1] "exp" "bah" "exp"

速度。这比其他@Frank的答案中的字符串修改快一点。

(感谢@rawr指出我们都应该打开perl解析。)

ss <- c(replicate(1e6,s))
system.time(replace(ss,grep("experiences",ss,perl=TRUE),"exp"))
#    user  system elapsed 
#     0.6     0.0     0.6 
system.time(gsub(".*experiences.*", "exp", ss,perl=TRUE))
#    user  system elapsed 
#    2.39    0.00    2.38

在每个答案中删除替换操作,看起来匹配的不同模式构成了大部分差异(与我在上一次编辑中看到的情况相反):

system.time(grep("experiences",ss,perl=TRUE))     # used in my answer
#    user  system elapsed 
#    0.64    0.00    0.64
system.time(grep(".*experiences.*",ss,perl=TRUE)) # used in purple-gravatar @Frank's answer
#    user  system elapsed 
#    1.82    0.00    1.82 

答案 1 :(得分:4)

您可以按如下方式使用gsub

 gsub(".*experiences.*", "exp", string, perl=TRUE) 
 # As @rawr notes, set perl=TRUE for improved efficiency

此正则表达式匹配具有0次或更多次字符的字符串(即.*),然后是&#34;体验&#34;,后跟任何字符0次或更多次。

在这种情况下,你仍然用&#34; exp&#34;替换整场比赛。但是通过使用正则表达式,您可以扩展匹配的定义(从&#34;体验&#34;到#34;。*体验。*&#34;)以实现所需的替换。

答案 2 :(得分:1)

gsub()用于将特定字符串替换为另一个字符串。在上面的代码中,如果执行以下操作,则整个字符串将更改为exp

result <- gsub(string, "exp", string)

但是,如果您使用grep()replace(),您将获得所需的结果。

res1 <- grep("pattern",string)

为您提供包含该模式的所有行,并在replace()中使用它。

res_new <- replace(string,res1,"exp")

答案 3 :(得分:0)

您还可以简单地使用gsub()并在这样的模式之前和之后添加.*

string<-"TransRights"
gsub(".*sR.*","HumanRights",string)

结果将是

HumanRights