在R中用没有首字母@的相同单词替换单词

Substitute word with same word without initial @ in R

我正在尝试在 R 中进行数据帧字符串替换。我需要找到所有以“@”开头的单词(没有 space,例如 @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"

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

谢谢。

怎么样

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

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

解释由 regex101.com 提供:

  • (^| )为第1攻略组; ^ 声明字符串开头的位置; |表示"or";空白 space 按字面意思匹配 space 字符
  • @ 按字面匹配字符 @(区分大小写)
  • (\w)是第2个Capturing Group,表示一个单词字符

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

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

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

来自 "Regular Expressions as used in R" 文档页面:

Patterns (?=...) and (?!...) are zero-width positive and negative lookahead assertions: they match if an attempt to match the ... forward from the current position would succeed (or not), but use up no characters in the string being processed.