找不到匹配项时,gsub返回空字符串

cbo*_*tig 7 regex grep r

我正在使用gsubR中的函数在文本列表中返回我的模式(引用数字)的出现.除非找不到匹配项,否则这很有用,在这种情况下,我会返回整个字符串,而不是空字符串.考虑这个例子:

data <- list("a sentence with citation (Ref. 12)",
             "another sentence without reference")

sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x))
Run Code Online (Sandbox Code Playgroud)

返回:

[1] "Ref. 12"                            "another sentence without reference"
Run Code Online (Sandbox Code Playgroud)

但是我想得到

[1] "Ref. 12"                            ""
Run Code Online (Sandbox Code Playgroud)

谢谢!

jor*_*ran 7

我可能会走另一条路,因为这sapply对我来说似乎没有必要,因为这些函数已经被矢量化了:

fun <- function(x){
    ind <- grep(".*(Ref. (\\d+)).*",x,value = FALSE)
    x <- gsub(".*(Ref. (\\d+)).*", "\\1", x)
    x[-ind] <- ""
    x
}

fun(data)
Run Code Online (Sandbox Code Playgroud)


Dav*_*uer 5

根据文档,这是gsub它返回输入字符串的一个特性,如果提供的模式没有匹配项,则返回整个字符串。

在这里,我grepl首先使用该函数返回给定字符串中模式存在/不存在的逻辑向量:

ifelse(grepl(".*(Ref. (\\d+)).*", data), 
      gsub(".*(Ref. (\\d+)).*", "\\1", data), 
      "")
Run Code Online (Sandbox Code Playgroud)

将其嵌入到函数中:

mygsub <- function(x){
     ans <- ifelse(grepl(".*(Ref. (\\d+)).*", x), 
              gsub(".*(Ref. (\\d+)).*", "\\1", x), 
              "")
     return(ans)
}

mygsub(data)
Run Code Online (Sandbox Code Playgroud)