2017-05-09 59 views
3

我想在R中做一个数据帧字符串替换。我需要找到所有以'@'开头的单词(没有空格,例如@word)并且改变'@ '为'!' (例如从@word到!字)。同时,它会保留“@”的其他实例(例如@或@@或@ [@])。例如,这是我原来的数据框(改:@def,@jkl,@stu):在R中用相同的单词替换没有初始@的相同单词

> df = data.frame(number = 1:4, text = c('abc @def ghi', '@jkl @ mno', '@[@] pqr @stu', 'vwx @@@ yz')) 
> df 
    number   text 
1  1 abc @def ghi 
2  2 @jkl @ mno 
3  3 @[@] pqr @stu 
4  4 vwx @@@ yz 

而这正是我需要它看起来像:

> df_result = data.frame(number = 1:4, text = c('abc !def ghi', '!jkl @ mno', '@[@] pqr !stu', 'vwx @@@ yz')) 
> df_result 
    number   text 
1  1 abc !def ghi 
2  2 !jkl @ mno 
3  3 @[@] pqr !stu 
4  4 vwx @@@ yz 

我曾尝试与

> gsub('@.+[a-z] ', '!', df$text) 
[1] "abc !ghi" "[email protected] mno"  "[email protected]"  "vwx @@@ yz" 

但结果不是理想的。任何帮助深表感谢。

谢谢。

回答

3

如何

gsub("(^|)@(\\w)", "\\1!\\2", df$text) 
# [1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz" 

这在一个字符串开头的@符号匹配,或空格之后。然后,我们在@符号后捕获单词字符,并用!代替@。的regex101.com

说明礼貌:

  • (^|)是第一捕获组; ^断言字符串的开始位置; |表示“或”;空白空间相匹配的空格字符字面上
  • @字符@字面上(区分大小写)
  • (\\w)是第二捕获组相匹配时,它表示一个单词字符

替换字符串\\1!\\2替换正则表达式匹配与第一捕获组(\\1),其次是!,其次是第二捕获组(\\2)。

+0

嗨Rich Scriven,非常感谢你的解决方案和背后的逻辑非常详细的解释。它完美的作品。祝你有美好的一天。 – user3550647

3

您可以使用正向前查找(?=...)

gsub("@(?=[A-Za-z])", "!", df$text, perl = TRUE) 
[1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz" 

从文档页面 “正则表达式与R使用”:

模式(?= ...)和(?!。 ..)是零宽度的正面和负面的前瞻断言:如果尝试匹配...从当前位置向前成功(或不)​​,但在正在处理的字符串中不使用字符。

+0

嗨Sraffa,非常感谢你的回答和解释。您的解决方案完美运作祝你有美好的一天。 – user3550647

相关问题