8

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

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

sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x))

回报:

[1] "Ref. 12"                            "another sentence without reference"

但我想得到

[1] "Ref. 12"                            ""

谢谢!

4

7 回答 7

7

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

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

fun(data)
于 2012-04-18T17:41:05.367 回答
5

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

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

ifelse(grepl(".*(Ref. (\\d+)).*", data), 
      gsub(".*(Ref. (\\d+)).*", "\\1", data), 
      "")

将其嵌入函数中:

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

mygsub(data)
于 2012-04-18T17:45:21.793 回答
2
xs <- sapply(data, function(x) gsub(".*(Ref. (\\d+)).*", "\\1", x))
xs[xs==data] <- ""
xs
#[1] "Ref. 12" ""       
于 2012-04-18T17:49:28.210 回答
1

strapplyc在 gsubfn 包中尝试:

library(gsubfn)

L <- fn$sapply(unlist(data), ~ strapplyc(x, "Ref. \\d+"))
unlist(fn$sapply(L, ~ ifelse(length(x), x, "")))

这给出了这个:

a sentence with citation (Ref. 12) another sentence without reference 
                         "Ref. 12"                                 "" 

如果您不介意列表输出,那么您可以使用 L 并忘记最后一行代码。请注意,fn$前缀将其应用于函数的公式参数转换为函数调用,因此第一行代码可以在没有fnas 的情况下编写sapply(unlist(data), function(x) strapplyc(x, "Ref x. \\d+"))

于 2012-04-19T04:25:22.740 回答
0

您可以尝试嵌入grep( ..., value = T)该功能。

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

unlist( sapply(data, function(x) { 
  x <- gsub(".*(Ref. (\\d+)).*", "\\1", x)
  grep( "Ref\\.", x, value = T )
  } ) )

有点笨重,但它的工作原理?它还删除了空的第二个引用。

于 2012-04-18T17:33:43.877 回答
0

基于@joran 的回答

功能:

extract_matches <- function(x,pattern,replacement,replacement_nomatch=""){
    x <- gsub(pattern,replacement,x)
    x[-grep(pattern,x,value = FALSE)] <- replacement_nomatch
    x
}

用法:

data <- list("with citation (Ref. 12)", "without reference", "")
extract_matches(data,  ".*(Ref. (\\d+)).*", "\\1")
于 2019-12-04T10:15:22.007 回答
0

另一种简单的方法是使用 gsub 但在新函数中指定您想要的 ''

noFalsePositives <- function(a,b,x) {
  return(ifelse(gsub(a,b,x)==x,'',gsub(a,b,x)))
}
# usage
noFalsePositives(".*(Ref. (\\d+)).*", "\\1", data)
# [1] "Ref. 12" "" 
于 2020-05-13T13:33:59.710 回答