检索文件名的一部分

时间:2016-02-25 07:27:35

标签: 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()函数可以返回所有这些数字。我引用了这些网址herehere

这是我尝试的代码,但没有用:

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

返回的是一个如下所示的文件名:

[1] "subject_9_4Feb2016_1611.txt"

我期待下面的内容,因为我需要每个sess_id成为上述整体文件格式的文件的属性。

[1] "1" or [1] "2" 

2 个答案:

答案 0 :(得分:1)

这意味着您需要在第三个&#34; _&#34;之后的所有内容。如果是这样的话 加载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"

答案 1 :(得分:1)

我们可以使用vm.showModal = function() { $('#detailsModal').modal('show'); }; 匹配所有字符,直到gsub后跟sess_|开头的字符,然后匹配大写字母后跟字符(_),直到字符串结尾(.*),并替换为$

''

或者使用gsub('^.*sess\\_|\\_[A-Z]+.*$', '', str1) #[1] "2" ,它会更加紧凑。默认情况下,str_extract仅提取匹配的第一个匹配项。在这里,我们提取正则表达式(str_extract)后面的数字(\\d+)。

(?<=sess_)

数据

library(stringr)
str_extract(str1, '(?<=sess_)\\d+')
#[1] "2"