在R中的多个位置查找字符的匹配项

在R中的多个位置查找字符的匹配项,r,regex,character,matching,R,Regex,Character,Matching,我有一个字符向量,我想匹配第一部分和最后一部分,这样我就可以生成一个匹配字符的列表 下面是一个示例字符:20190625_165055_0f4e 第一部分是日期。最后4个字符是唯一标识符。我需要列表中这两部分重复的所有字符 我可以使用一个简单的正则表达式根据位置匹配字符,但有些正则表达式的中间字符比其他正则表达式多,例如20190813_170215_17_1057 以下是一个示例向量: mylist<-c("20190712_164755_1034","20

我有一个字符向量,我想匹配第一部分和最后一部分,这样我就可以生成一个匹配字符的列表

下面是一个示例字符:20190625_165055_0f4e 第一部分是日期。最后4个字符是唯一标识符。我需要列表中这两部分重复的所有字符

我可以使用一个简单的正则表达式根据位置匹配字符,但有些正则表达式的中间字符比其他正则表达式多,例如20190813_170215_17_1057

以下是一个示例向量:

mylist<-c("20190712_164755_1034","20190712_164756_1034","20190712_164757_1034","20190719_164712_1001","20190719_164713_1001","20190722_153110_1054","20190813_170215_17_1057","20190813_170217_22_1057","20190828_170318_14_1065")

编辑:使我的字符向量更简单,并添加了所需的输出

我们可以使用sub删除中间的子字符串,并基于此将列表拆分为字符向量列表


在潜艇里,我们捕获。。。一个或多个数字\\d+,从字符串的开始“^”,后跟一个u和其他字符。*到u,并捕获字符串的结尾$之前不是[^]+的其余字符。在替换中,我们指定捕获组的反向引用\\1、\\2。基本上,去除中间的不同部分并保持固定子串在开始和结束,并用它来分割字符向量

这是一个用Tidir提取的替代方法。 我们可以使用extract将日期部分和最后4个字符提取到单独的列中。然后,我们使用group_split根据这两列分割数据

tibble::tibble(mylist) %>%
   tidyr::extract(mylist, c('col1', 'col2'), regex = '(.*?)_.*_(.*)', 
                  remove = FALSE) %>%
   dplyr::group_split(col1, col2, .keep = FALSE)


#[[1]]
# A tibble: 3 x 1
#  mylist              
#  <chr>               
#1 20190712_164755_1034
#2 20190712_164756_1034
#3 20190712_164757_1034

#[[2]]
# A tibble: 2 x 1
#  mylist              
#  <chr>               
#1 20190719_164712_1001
#2 20190719_164713_1001

#[[3]]
# A tibble: 1 x 1
#  mylist              
#  <chr>               
#1 20190722_153110_1054
#...

这几乎奏效了。当中间的子字符串长度不同时,它会以不同的方式处理它。在mylist上运行建议会产生正确的副本,但子字符串中有两个额外字符的字符除外,例如子字符串通常是DDDD,但这些是DDDD_dd@APD更新了帖子。希望能有帮助。谢谢APD,如果下面的答案不能解决您的问题,我同意akrun的观点,如果您提供一些预期的输出,将更容易提供帮助。这是我最初的答案splitmylist,sub^\\d++.*.[uuu[^.]+$,\\ 1\\\2,MyList如果有人想通过{s | s |[s[0,8],s[-4,-2]}值将其翻译为R:arr.group.[u,则以下Ruby代码可以做到这一点。
lst1 <- split(mylist, sub("^(\\d+)_.*_([^_]+)$", "\\1_\\2", mylist))
lst1
#$`20190712_1034`
#[1] "20190712_164755_1034" "20190712_164756_1034" "20190712_164757_1034"

#$`20190719_1001`
#[1] "20190719_164712_1001" "20190719_164713_1001"

#$`20190722_1054`
#[1] "20190722_153110_1054"

#$`20190813_1057`
#[1] "20190813_170215_17_1057" "20190813_170217_22_1057"

#$`20190828_1065`
#[1] "20190828_170318_14_1065"
library(tidyr)
result <- as.data.frame(mylist) %>%
  extract(1, into = c("date","var1","var2"),
          regex = "(^[0-9]{8}_[0-9]{6})_?(.*)?_([^_]+$)",
          remove = FALSE)
result
#                    mylist            date var1 var2
#1     20190625_165055_0f4e 20190625_165055      0f4e
#2     20190625_165056_0f4e 20190625_165056      0f4e
#3     20190625_165057_0f4e 20190625_165057      0f4e
#4     20190712_164755_1034 20190712_164755      1034
#...
#27 20190828_170318_14_1065 20190828_170318   14 1065
#28 20190828_170320_26_1065 20190828_170320   26 1065
#...
split(result,result$var2)
#$`0f22`
#                 mylist            date var1 var2
#29 20190917_165157_0f22 20190917_165157      0f22
#
#$`0f2a`
#                 mylist            date var1 var2
#18 20190813_152856_0f2a 20190813_152856      0f2a
#19 20190813_152857_0f2a 20190813_152857      0f2a
#...
tibble::tibble(mylist) %>%
   tidyr::extract(mylist, c('col1', 'col2'), regex = '(.*?)_.*_(.*)', 
                  remove = FALSE) %>%
   dplyr::group_split(col1, col2, .keep = FALSE)


#[[1]]
# A tibble: 3 x 1
#  mylist              
#  <chr>               
#1 20190712_164755_1034
#2 20190712_164756_1034
#3 20190712_164757_1034

#[[2]]
# A tibble: 2 x 1
#  mylist              
#  <chr>               
#1 20190719_164712_1001
#2 20190719_164713_1001

#[[3]]
# A tibble: 1 x 1
#  mylist              
#  <chr>               
#1 20190722_153110_1054
#...