gsub:如果没有用括号括起来替换单词

时间:2017-01-06 16:04:58

标签: r regex

我想gsub一个字,但只是没有用括号括起来的情况。

x <- c("hello","[hello]")

我希望gsub(regex,"test",x)返回c("test","[hello]"),但我无法创建正确的正则表达式语句。

一个天真的实现是:gsub("^(?!\\[).*$","test",x, perl=TRUE),它适用于上述情况,但只是因为每个字符串都是一个单词,所以它不适用于x <- "hello [hello]",例如,我希望它是test [hello]

我尝试过一堆不同的前瞻无济于事。任何帮助将不胜感激。

输入

x <- c("hello", "[hello]", "hello [hello]")

所需

# [1] "test"         "[hello]"      "test [hello]"

2 个答案:

答案 0 :(得分:1)

您可以使用否定环视来设置字边界的约束,例如(?<!\\[)\\b\\w+\\b(?!\\])仅在字边界不是[]时才会替换字:

gsub("(?<!\\[)\\b\\w+\\b(?!\\])", "test", x, perl = TRUE)
# [1] "test [hello]"       # assuming this is your desired output

\\b\\w+\\b会查找一个单词,但带有负面后瞻?<!和否定前瞻?!,单词边界不应为[]。您还可以参考this answer

答案 1 :(得分:1)

我们可以使用grep

轻松完成此操作
x[grep("^[^[]+$", x)] <- "test"
x
#[1] "test"    "[hello]"

sub

sub("^[^[]+", "test", x)
#[1] "test"    "[hello]"

对于第二种情况

sub("^\\b[^[+]+\\b", "test", x1)
#[1] "test [hello]"

数据

x <- c("hello","[hello]")
x1 <- "hello [hello]"