R正则表达式:如何提取标题中带有一位或两位数字的字符串?

时间:2016-03-09 18:43:07

标签: regex r

我有一堆编号的文件名,我希望能够根据正则表达式语句提取。

例如,假设我有以下文件名:

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]),那么棘手的部分。有任何提示可以帮助解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

我也认为Sam的答案是正确的,但是以防万一你还需要快速提取非顺序项,这里是你如何轻松构建你的正则表达式需要(这些子模式将在"^run[.]dat[.]gz$"之间使用):

  • 使用[5-8]匹配58的所有数字(如当前示例所示)
  • 对于非连续的一位数值,请单独添加范围([1-37-9]将匹配1237,{{ 1}},8
  • 当您需要组合不同长度的数字时,请使用9的替换:
    • (...|...) - 将匹配(1[2-4]|2[89])12131428
    • 29 - 将匹配(2[3-5]|[0-2])23242501

在您的情况下,您可以使用

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"