正则表达式在 R 中提取部分文件名

Regex extract parts of file names in R

提问人:Mark Davies 提问时间:10/10/2023 更新时间:10/11/2023 访问量:63

问:

我正在将多个 excel 文件读入 R,我想将部分文件名用作数据。 我的文件名在列表中,看起来像这样: “文件夹//study30/01_study30_Baseline.xlsx”和“文件夹//study30/01_study30_6M.xlsx”

我提取研究编号(在本例中为 ),如下所示:30

qtest = "Folder//Subfolder/study30/01_study30_Baseline.xlsx"
qt1 = gsub("Folder//Subfolder/study", "", qtest) 
qt1
[1] "30/01_study30_Baseline.xlsx"

qt2 = gsub("\\/\\S+\\.xlsx$", "", qt1)
qt2
[1] "30"

现在,我想提取时间,在这些示例中为“基线”和“6M”。 这是我的尝试,从“.xlsx”向后阅读:

time = grep("/\\_[A-Za-z0-9]+\\.xlsx$", t1 , value= T)

这是不正确的。在这些示例中,获得“Baseline”和“6M”的正确正则表达式是什么?

R 正则表达式 grep

评论

3赞 Clemsang 10/10/2023
我喜欢这个清晰可读的:gsub(".*_|\\.xlsx", "", x)
0赞 Onyambu 10/10/2023
也试试tools::file_path_sans_ext(basename(gsub("_", "/", qtest)))

答:

2赞 Wiktor Stribiżew 10/10/2023 #1

你可以使用

sub("^(?:.*_)?([^_/]+)\\.xlsx$", "\\1", qtest)

请参阅正则表达式演示细节

  • ^- 字符串的开头
  • (?:.*_)?- 任意零个或多个字符的可选序列,直到最右边_
  • ([^_/]+)- 第 1 组(在替换模式中引用此文本):除 和 之外的一个或多个字符\1_/
  • \.xlsx- 文字文本.xlsx
  • $- 字符串末尾。

请参阅 R 演示

x <- c("Folder//Subfolder/study30/01_study30_Baseline.xlsx", "Folder//study30/01_study30_6M.xlsx")
sub("^(?:.*_)?([^_/]+)\\.xlsx$", "\\1", x)
## => [1] "Baseline" "6M"      
1赞 LMc 10/10/2023 #2

.*是贪婪的,所以它会匹配所有东西,直到最后.然后,您可以在以下之前捕获一个或多个单词字符:_()+\\w.xlsx

sub(".*_(\\w+)\\.xlsx$", "\\1", x)

你不一定需要正则表达式来做到这一点(尽管从技术上讲,使用的是正则表达式):sub

x <- c("Folder//study30/01_study30_Baseline.xlsx", "Folder//study30/01_study30_6M.xlsx")

sapply(str_split(sub(".xlsx", "", x), "_"), tail, 1)
# [1] "Baseline" "6M" 

使用 删除扩展名,将剩余的文件名拆分为“_”,并使用 .subtail

或者,您可以按“_”或“.”拆分路径,然后选择第三个元素:

sapply(str_split(x, "_|\\."), `[`, 3)

评论

0赞 Mark Davies 10/11/2023
我真的很喜欢在这里使用str_split。在您的最终选择中,再制造是什么?[
1赞 LMc 10/11/2023
@MarkDavies 在 R 中用于提取元素。你可能更习惯于这样看:提取第三个元素。但是,您可以像使用函数一样使用它:.在将其用作函数时,我们可以将其应用于提取每个列表项的第三个向量元素的结果。[x <- 1:3; x[3]`[`(x, 3)str_split
0赞 LMc 10/11/2023
这可以更详细地改写为:sapply(str_split(x, "_|\\."), \(y) y[3])