我有一堆编号的文件名,我希望能够根据正则表达式语句提取。
例如,假设我有以下文件名:
file.names <- paste0("run", 0:99, ".dat.gz")
如果我想提取文件5到8,我需要一个返回以下内容的正则表达式:
grep("correct_regex", file.names, value=TRUE)
"run5.dat.gz" "run6.dat.gz" "run7.dat.gz" "run8.dat.gz"
或者如果我想返回9到21的文件,它将返回以下内容:
grep("correct_regex", file.names, value=TRUE)
"run9.dat.gz" "run10.dat.gz" "run11.dat.gz" "run12.dat.gz" "run13.dat.gz" "run14.dat.gz" "run15.dat.gz" "run16.dat.gz" "run17.dat.gz" "run18.dat.gz" "run19.dat.gz" "run20.dat.gz" "run21.dat.gz"
如果开发一个提取数字而不是数字的正则表达式(例如[0-9]
),那么棘手的部分。有任何提示可以帮助解决这个问题吗?
答案 0 :(得分:2)
我也认为Sam的答案是正确的,但是以防万一你还需要快速提取非顺序项,这里是你如何轻松构建你的正则表达式需要(这些子模式将在"^run
和[.]dat[.]gz$"
之间使用):
[5-8]
匹配5
到8
的所有数字(如当前示例所示)[1-37-9]
将匹配1
,2
,3
,7
,{{ 1}},8
)9
的替换:
(...|...)
- 将匹配(1[2-4]|2[89])
,12
,13
,14
和28
29
- 将匹配(2[3-5]|[0-2])
,23
,24
,25
,0
和1
在您的情况下,您可以使用
2
请注意,> file.names <- paste0("run", 0:99, ".dat.gz")
> grep("^run[5-8][.]dat[.]gz$", file.names, value=TRUE)
[1] "run5.dat.gz" "run6.dat.gz" "run7.dat.gz" "run8.dat.gz"
>
匹配字符串的开头,^
匹配字符串的结尾(因此,此正则表达式确保完整的字符串匹配)。
答案 1 :(得分:0)
您可以使用一个简单的函数来完成此操作并避免使用正则表达式:
get_numbered_filenames <- function(num_vec){
target <- paste0("run", num_vec, ".dat.gz")
file.names[file.names %in% target]
}
get_numbered_filenames(9:21)
[1] "run9.dat.gz" "run10.dat.gz" "run11.dat.gz" "run12.dat.gz" "run13.dat.gz" "run14.dat.gz"
[7] "run15.dat.gz" "run16.dat.gz" "run17.dat.gz" "run18.dat.gz" "run19.dat.gz" "run20.dat.gz"
[13] "run21.dat.gz"