我有许多具有以下格式的文件:
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, or 3)”部分,并且我认为 sub()
函数可以返回所有这些数字。我引用这些网址,here和 here .
这是我尝试过的代码,但不起作用:
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"
最佳答案
我们可以使用gsub
来做到这一点通过匹配所有字符直到 sess
接下来是 _
或|
以 _
开头的字符后跟大写字母,后跟字符 ( .*
),直到字符串末尾 ( $
),然后替换为 ''
.
gsub('^.*sess\\_|\\_[A-Z]+.*$', '', str1)
#[1] "2"
或者使用str_extract
,它会更加紧凑。默认情况下,str_extract
只提取第一次出现的匹配项。在这里,我们提取遵循正则表达式查找 ( \\d+
) 的数字 ( (?<=sess_)
)。
library(stringr)
str_extract(str1, '(?<=sess_)\\d+')
#[1] "2"
数据
str1 <- "sub_41_sess_2_ABCxyz_23Feb2016_2932.txt")
关于regex - 检索文件名的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35620915/