用R中的初始@替换带有相同单词的单词

时间:2017-05-09 01:25:51

标签: r string symbols gsub

我正在尝试在R中进行数据帧字符串替换。我需要找到前面带有' @'的所有单词。 (没有空格,例如@word)并更改' @'为了'!' (例如从@word到!word)。与此同时,它保留了' @'的其他实例。 (例如@或@@或@ [@])。例如,这是我的原始数据框(要更改:@ def,@ jkl,@ stu):

> 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"   "!@ mno"     "!@stu"      "vwx @@@ yz"

但结果不是理想的结果。非常感谢任何帮助。

谢谢。

2 个答案:

答案 0 :(得分:3)

怎么样

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

这匹配字符串开头或空格后的@符号。然后,我们会在@符号后面捕获单词字符,并将@替换为!

regex101.com提供的解释:

  • (^| )是第一个捕获组; ^在字符串的开头声明位置; |表示“或”;空格与字面上的空格字符匹配
  • @字面匹配字符@(区分大小写)
  • (\\w)是第二个捕获组,它表示一个单词字符

替换字符串\\1!\\2将正则表达式匹配替换为第一个捕获组(\\1),后跟!,然后是第二个捕获组(\\2

答案 1 :(得分:3)

您可以使用积极的前瞻(?=...)

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

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

  

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