Regex 在R中查找并替换整个值

Regex 在R中查找并替换整个值,regex,r,replace,Regex,R,Replace,我正在寻找一种方法来使用R中的find and replace函数替换字符串的整个值,而不仅仅是字符串的匹配部分。我有一个包含很多(非常)长名称的数据集,我正在寻找一种有效的方法来查找和更改它们的值 例如,我试图改变整个字符串 string <- "Generally.speaking..do.you.prefer.to.try.out.new.experiences.like.trying.things.and.meeting.new.people..or.do.you.prefer.f

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

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

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."
使用此代码

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

string无需使用
gsub
修改字符串,因为您知道所需的值(“exp”)


速度。这比中的字符串修改快一点other@Frank我的回答是

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


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


速度。这比中的字符串修改快一点other@Frank我的回答是

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

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

result <- gsub(string, "exp", string)
为您提供所有具有该模式的行,并在
replace()
中使用它

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

result <- gsub(string, "exp", string)
为您提供所有具有该模式的行,并在
replace()
中使用它


resu new您可以按如下方式使用
gsub

 gsub(".*experiences.*", "exp", string, perl=TRUE) 
 # As @rawr notes, set perl=TRUE for improved efficiency
此正则表达式匹配任何字符0或更多次(即
*
)后跟“体验”的字符串,后跟任何字符0或更多次


在这种情况下,您仍然使用“exp”替换整个匹配,但通过使用regex,您可以扩展匹配的定义(从“经验”扩展到“*experience.*”),以实现所需的替换。

您可以使用
gsub
,如下所示:

 gsub(".*experiences.*", "exp", string, perl=TRUE) 
 # As @rawr notes, set perl=TRUE for improved efficiency
此正则表达式匹配任何字符0或更多次(即
*
)后跟“体验”的字符串,后跟任何字符0或更多次


在这种情况下,您仍然使用“exp”替换整个匹配项,但通过使用regex,您可以扩展匹配项的定义(从“体验”到“*experience.*”),以实现所需的替换。

您也可以简单地使用
gsub()
并在模式前后添加
*
,如下所示:

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

您也可以简单地使用
gsub()
并在模式前后添加
*
,如下所示:

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


因此,如果找到了“经验”,请返回“exp”,否则返回整个字符串?@rawr更接近了!但许多字符串名称仍然完好无损。@frank是的。因此,只有在字符串中找到模式时才替换该值。我将搜索许多长名称的值。因此,如果找到“experiences”,请返回“exp”,否则返回整个字符串?@rawr更接近了!但许多字符串名称仍然完好无损。@frank是的。因此,只有在字符串中找到模式时才替换该值。我将搜索许多长名称的值。关于字符串替换和修改所涉及的速度差异,这一点很好!我不是弗兰克,但如果你在
system.time(gsub(“.*experiences.*”,“exp”,ss))
中使用
perl=TRUE
,它的速度将是我的两倍least@rawr坦率地说,这是关于效率的另一个好观点弗兰克(紫色)@rawr谢谢;补充。唉,坦率和最优并不总是一致的。启用perl后,我的最后一点正好相反,因此我也对其进行了实质性的编辑。关于字符串替换与修改所涉及的速度差异,这一点很好!我不是弗兰克,但如果你在
system.time(gsub(“.*experiences.*”,“exp”,ss))
中使用
perl=TRUE
,它的速度将是我的两倍least@rawr坦率地说,这是关于效率的另一个好观点弗兰克(紫色)@rawr谢谢;补充。唉,坦率和最优并不总是一致的。启用perl后,我的最后一点正好相反,因此我还对该.Hmmm进行了大量编辑,因此可能我没有创建一个好的示例。我正在对数据集执行的替换使用“gsub(“.experiences.”,“exp”,names(fs)”,其中names(fs)是所有标题名列的向量。当我将代码应用于向量时,它只会部分替换字符串值“”,一般来说,.do.you.preference.to.try.out.newexp“”。我不知道为什么列向量会不同。这很管用!好眼力,弗兰克!学习目的问题:做什么。*做什么?我对正则表达式有点熟悉,我不知道哦,
是“任意字符”,而
*
是“任意次数”:)对不起,我已经删除了我的评论,认为这是错误的。顺便说一句,backticks(在我键盘上的tilde按钮上)用于comments.Hmmm中的代码格式,所以可能我没有创建一个好的示例。我正在对数据集执行的替换使用“gsub(“.experiences.”,“exp”,names(fs)”,其中names(fs)是所有标题名列的向量。当我将代码应用于向量时,它只会部分替换字符串值“”,一般来说,.do.you.preference.to.try.out.newexp“”。我不知道为什么列向量会不同。这很管用!好眼力,弗兰克!学习目的问题:做什么。*做什么?我对正则表达式有点熟悉,我不知道哦,
是“任意字符”,而
*
是“任意次数”:)对不起,我已经删除了我的评论,认为这是错误的。顺便说一句,反勾号(在我键盘上的波浪按钮上)用于注释内的代码格式。正如我上面提到的,我想我在创建示例时搞砸了。我将gsub应用于names(df),以便r通过头名称向量查找具有该模式的字符串
res_new <- replace(string,res1,"exp")
 gsub(".*experiences.*", "exp", string, perl=TRUE) 
 # As @rawr notes, set perl=TRUE for improved efficiency
string<-"TransRights"
gsub(".*sR.*","HumanRights",string)
HumanRights