Regex 检索文件名的一部分
我有许多文件的格式如下:Regex 检索文件名的一部分,regex,r,file,filenames,Regex,R,File,Filenames,我有许多文件的格式如下: sub_(number 1 to 60)_ sess_(number 1, 2, or 3)_ (some letters)_ DDMMMYYYY_(some number with either 3 or 4 digit).txt 例如: sub_41_sess_2_ABCxyz_23Feb2016_2932.txt 我只想检索“sess”部分之后的部分“(1、2或3)”,我认为sub()函数可以返回所有这些数字。我引用了这些URL,并且 以下是我尝试过的代码,但
sub_(number 1 to 60)_ sess_(number 1, 2, or 3)_ (some letters)_ DDMMMYYYY_(some number with either 3 or 4 digit).txt
例如:
sub_41_sess_2_ABCxyz_23Feb2016_2932.txt
我只想检索“sess”部分之后的部分“(1、2或3)”,我认为sub()
函数可以返回所有这些数字。我引用了这些URL,并且
以下是我尝试过的代码,但不起作用:
dir <- "path/"
filelist = list.files(path = dir, pattern = ".*.txt")
filelist
for (f in filelist) {
sess_id <- sub("^(sub_[1-60])^(_sess_)(1 |2 |3)^.*","\\1",c(f), perl = TRUE)
}
sess_id
我期待下面这样的东西,因为我需要每个sess_id
都是上面所述的文件整体格式的一个属性
[1] "1" or [1] "2"
这意味着在第三个“u”之后,你需要所有的东西。如果是这样的话
加载
stringr
包
library(stringr)
a<-"sub_41_sess_2_ABCxyz_23Feb2016_2932.txt"
str_sub(a, start=str_locate_all(a, "_")[[1]][3]+1, end = str_locate_all(a, "_")[[1]][3]+1 )
[1] "2"
库(stringr)
a我们可以使用gsub
匹配所有字符,直到sess
后跟
或
以
开头的字符,后跟大写字母,后跟字符(*
),直到字符串($
)结束,并替换为'
或者使用str\u extract
,它将更加紧凑。默认情况下,str_extract
仅提取匹配的第一个匹配项。在这里,我们提取了regex lookaround()()后面的数字()(?您可以尝试sub(“sub\\\d+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
如果我使用问题中所示的“for”函数,str_extract()会不会函数循环遍历目录中的所有文件?我用“for”循环尝试了你的第二种方法,只处理了list.files中的最后一个文件。@user94216是的,你可以使用for
循环,但必须创建一个输出对象为list
。或者使用lappy
循环遍历文件并应用str_提取
。例如,sapply(文件,函数(x)stru_提取(x,”(?)?
library(stringr)
a<-"sub_41_sess_2_ABCxyz_23Feb2016_2932.txt"
str_sub(a, start=str_locate_all(a, "_")[[1]][3]+1, end = str_locate_all(a, "_")[[1]][3]+1 )
[1] "2"
gsub('^.*sess\\_|\\_[A-Z]+.*$', '', str1)
#[1] "2"
library(stringr)
str_extract(str1, '(?<=sess_)\\d+')
#[1] "2"
str1 <- "sub_41_sess_2_ABCxyz_23Feb2016_2932.txt")