这是一种方法:
regmatches(tt, regexpr("[0-9].*[0-9]", tt))
我假设您的文件名中没有其他数字。因此,我们只搜索数字的开头并使用贪心运算符.*
,以便捕获最后一个数字之前的所有内容。这是使用regexpr
which 将获得匹配的位置来完成的。然后我们使用regmatches
从这些匹配的位置中提取(子)字符串。
哪里tt
是:
tt <- c("Species Count (2011-12-15-07-09-39).xls", "Species Count 0511.xls",
"Species Count 151112.xls", "Species Count1011.xls",
"Species Count2012-01.xls", "Species Count201207.xls",
"Species Count2013-01-15.xls")
基准测试:
注意:Windows 和 *nix 机器之间的基准测试结果可能会有所不同(正如 @Hansi 在下面的注释下指出的那样)。
那里有一些不错的答案。所以,是时候进行基准测试了:)
tt <- rep(tt, 1e5) # tt is from above
require(microbenchmark)
require(stringr)
aa <- function() regmatches(tt, regexpr("[0-9].*[0-9]", tt))
bb <- function() gsub("[A-z \\.\\(\\)]", "", tt)
cc <- function() str_extract(tt,'([0-9]|[0-9][-])+')
microbenchmark(arun <- aa(), agstudy <- cc(), Jean <- bb(), times=25)
Unit: seconds
expr min lq median uq max neval
arun <- aa() 1.951362 2.064055 2.198644 2.397724 3.236296 25
agstudy <- cc() 2.489993 2.685285 2.991796 3.198133 3.762166 25
Jean <- bb() 7.824638 8.026595 9.145490 9.788539 10.926665 25
identical(arun, agstudy) # TRUE
identical(arun, Jean) # TRUE