我正在尝试在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"
但结果不是理想的结果。非常感谢任何帮助。
谢谢。
答案 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中使用的正则表达式”文档页面:
模式(?= ...)和(?!...)是零宽度正和负前瞻断言:如果尝试匹配当前位置的...前进将成功(或不是) ),但在正在处理的字符串中不使用任何字符。