在R中用相同的单词替换没有初始@的相同单词
问题描述:
我想在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"
但结果不是理想的。任何帮助深表感谢。
谢谢。
答
如何
gsub("(^|)@(\\w)", "\\1!\\2", df$text)
# [1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz"
这在一个字符串开头的@
符号匹配,或空格之后。然后,我们在@
符号后捕获单词字符,并用!
代替@
。的regex101.com
说明礼貌:
-
(^|)
是第一捕获组;^
断言字符串的开始位置;|
表示“或”;空白空间相匹配的空格字符字面上 -
@
字符@
字面上(区分大小写) -
(\\w)
是第二捕获组相匹配时,它表示一个单词字符
替换字符串\\1!\\2
替换正则表达式匹配与第一捕获组(\\1
),其次是!
,其次是第二捕获组(\\2
)。
答
您可以使用正向前查找(?=...)
gsub("@(?=[A-Za-z])", "!", df$text, perl = TRUE)
[1] "abc !def ghi" "!jkl @ mno" "@[@] pqr !stu" "vwx @@@ yz"
从文档页面 “正则表达式与R使用”:
模式(?= ...)和(?!。 ..)是零宽度的正面和负面的前瞻断言:如果尝试匹配...从当前位置向前成功(或不),但在正在处理的字符串中不使用字符。
+0
嗨Sraffa,非常感谢你的回答和解释。您的解决方案完美运作祝你有美好的一天。 – user3550647
嗨Rich Scriven,非常感谢你的解决方案和背后的逻辑非常详细的解释。它完美的作品。祝你有美好的一天。 – user3550647