Regex 将由多个分隔符定义的字符串部分拆分为分隔符中的多个变量

Regex 将由多个分隔符定义的字符串部分拆分为分隔符中的多个变量,regex,r,string,split,Regex,R,String,Split,我有一个大的文件名列表,我需要使用R从中提取信息。信息由多个破折号和下划线分隔。我很难找到一种方法来适应分隔符之间的字符数不一致这一事实(信息的顺序将保持不变,使用的分隔符也是一样(希望如此)) 例如: f <- data.frame(c("EI-SM4-AMW11_20160614_082800.wav", "PA-RF-A50_20160614_082800.wav"), stringsAsFactors = FALSE) colnames(f)<-"filename" f

我有一个大的文件名列表,我需要使用R从中提取信息。信息由多个破折号和下划线分隔。我很难找到一种方法来适应分隔符之间的字符数不一致这一事实(信息的顺序将保持不变,使用的分隔符也是一样(希望如此))

例如:

 f <- data.frame(c("EI-SM4-AMW11_20160614_082800.wav", "PA-RF-A50_20160614_082800.wav"), stringsAsFactors = FALSE)
 colnames(f)<-"filename"
 f$area <- str_sub(f$filename, 1, 2)
 f$rec <- str_sub(f$filename, 4, 6)
 f$site <- str_sub(f$filename, 8, 12)

f从“tidyr”软件包中尝试以下操作:

library(tidyr)

f %>% separate(filename, c('area', 'rec', 'site'), sep = '-')
您还可以沿多个差值Delimeter拆分,如下所示:

f %>% separate(filename, c('area', 'rec', 'site', 'date', 'don_know_what_this_is', 'file_extension'), sep = '-|_|\\.')
然后使用
dplyr
select
功能仅保留所需的列:

 library(dplyr)
 library(tidyr)

 f %>% 
   separate(filename,
            c('area', 'rec', 'site', 'date',
              'don_know_what_this_is', 'file_extension'), 
            sep = '-|_|\\.') %>%
   select(area, rec, site)
大概是这样的:

library(stringr)
library(dplyr)

f$area <- word(f$filename, 1, sep = "-")
f$rec <- word(f$filename, 2, sep = "-")
f$site <- word(f$filename, 3, sep = "-") %>%
        word(1,sep = "_")        
库(stringr)
图书馆(dplyr)

默认情况下,f$area
separate
按任何分隔符拆分(请注意,如果在第二个示例中未定义分隔符,会发生什么情况),并删除超出定义的新列数的任何“额外”部分,因此无需执行第二个
select
步骤。要保留原始列,请参见
remove=FALSE
。感谢RoyalTS-我没有想到使用tidyr完成此任务,但此解决方案非常有效。我确实使用了aosmith的建议,不定义分隔符,这使得解决方案对于在文件前缀中添加奇怪内容的人来说更加健壮。(请注意,文件扩展名之前的最后一个块是hhmmss中的时间)自然语言中没有与这两种方法匹配的描述。您有两个破折号实例和两个下划线实例,您只需要两个或三个项目。描述你所做的,而不是展示失败的代码。
library(stringr)
library(dplyr)

f$area <- word(f$filename, 1, sep = "-")
f$rec <- word(f$filename, 2, sep = "-")
f$site <- word(f$filename, 3, sep = "-") %>%
        word(1,sep = "_")