Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 检索文件名的一部分_Regex_R_File_Filenames - Fatal编程技术网

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")