提问人:Mark Davies 提问时间:10/10/2023 更新时间:10/11/2023 访问量:63
正则表达式在 R 中提取部分文件名
Regex extract parts of file names in R
问:
我正在将多个 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”的正确正则表达式是什么?
答:
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"
使用 删除扩展名,将剩余的文件名拆分为“_”,并使用 .sub
tail
或者,您可以按“_”或“.”拆分路径,然后选择第三个元素:
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])
评论
gsub(".*_|\\.xlsx", "", x)
tools::file_path_sans_ext(basename(gsub("_", "/", qtest)))