我正在使用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)
谢谢!
我可能会走另一条路,因为这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)
根据文档,这是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)