在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.
我正在尝试在 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.