我有一个字符串向量,想在每个字符串中的每个单词之前添加一个+。
strings <- c('string one', 'string two', 'string three')
strings_new <- str_replace_all(strings, "\\b\\w", '+')
string_new
不幸的是,这是替换第一个字符,而不是添加+符号。我不太熟悉正则表达式,知道如何解决这个问题。
任何帮助都会很棒。
由于
答案 0 :(得分:7)
使用捕获的组是执行此操作的一种方法。使用括号进行分组并使用\\1
进行回忆。
strings_new <- str_replace_all(strings, "(\\b\\w)", '+\\1')
strings_new
[1] "+string +one" "+string +two" "+string +three"
答案 1 :(得分:3)
您可以使用基础R 解决方案,使用匹配起始字词边界的PCRE正则表达式[[:<:]]
,这是非字词和字词字符之间的位置:
strings <- c('string one', 'string two', 'string three')
gsub("[[:<:]]", "+", strings, perl=TRUE)
# => [1] "+string +one" "+string +two" "+string +three"
或者,您可以使用(\w+)
(匹配并捕获第1组中的任何一个或多个字符,即字母,数字或_
)TRE正则表达式替换为{{1和替换后向引用+
来恢复输出中消耗的字符:
\1
请注意,这里不需要单词边界,因为char匹配的第一个单词已经在单词边界处,并且由于gsub("(\\w+)", '+\\1', strings)
# => [1] "+string +one" "+string +two" "+string +three"
量词,后续单词chars将被消耗。请参阅regex demo。
使用基于+
的ICU正则表达式,您可以使用
str_replace_all
> str_replace_all(strings, "\\w+", '+\\0')
[1] "+string +one" "+string +two" "+string +three"
是对整个比赛的替代反向引用。
答案 2 :(得分:1)
如下所示,您可以使用正则表达式\b(?=\w)
和perl=T
,在没有捕获组的情况下(正如其他人所示)执行此操作。
strings <- c('string one', 'string two', 'string three')
gsub("\\b(?=\\w)", "+", strings, perl=T)
结果
[1] "+string +one" "+string +two" "+string +three"
答案 3 :(得分:0)
另一种方法是将strsplit()
与paste0()
结合使用:
res <- lapply(strsplit(strings, " "), function(x) paste0("+", x))
sapply(res, paste0, collapse = " ")
# [1] "+string +one" "+string +two" "+string +three"
对某些人来说,优点可能是你不必与正则表达式搏斗。但是,我总是更喜欢Jasbner和Wictor的直接正则表达式语句