弯曲括号之间的匹配数字

时间:2018-12-04 21:11:22

标签: r regex

library(tidyverse)

我有以下字符串:

str <- "1170\t{\r\n1170\t   860\r\n1170\t  5530\r\n1170\t   690\r\n1170\t  1200\r\n1170\t   390\r\n1170\t   740\r\n1170\t   350\r\n1170\t   490\r\n1170\t   360\r\n1170\t   440\r\n1170\t   450\r\n1170\t   580\r\n1170\t   620\r\n1170\t   740\r\n1300\t   730\r\n1300\t   870\r\n1300\t   800\r\n1300\t   850\r\n1300\t   810\r\n1300\t   870\r\n1300\t   830\r\n1300\t   860\r\n1300\t  1050\r\n1300\t   540\r\n1300\t   550\r\n1300\t   300\r\n1300\t   280\r\n1300\t   190\r\n1430\t   150\r\n1430\t    90\r\n1430\t    70\r\n1430\t    40\r\n1430\t   908\r\n1430\t  1238\r\n1430\t  3553\r\n1430\t   588\r\n1430\t    73\r\n1430\t 65480\r\n1430\t 19714\r\n1430\t  2756\r\n1430\t}"

我想做的是提取最远的数字(1170)和 \ r 之前的所有其他数字(860、5530、690、1200等)。到目前为止,我的工作是这样的:

str_match(str, "(\\d+)\\t\\{\\s*([^.]*)\\t\\}")
#>      [,1]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
#> [1,] "1170\t{\r\n1170\t   860\r\n1170\t  5530\r\n1170\t   690\r\n1170\t  1200\r\n1170\t   390\r\n1170\t   740\r\n1170\t   350\r\n1170\t   490\r\n1170\t   360\r\n1170\t   440\r\n1170\t   450\r\n1170\t   580\r\n1170\t   620\r\n1170\t   740\r\n1300\t   730\r\n1300\t   870\r\n1300\t   800\r\n1300\t   850\r\n1300\t   810\r\n1300\t   870\r\n1300\t   830\r\n1300\t   860\r\n1300\t  1050\r\n1300\t   540\r\n1300\t   550\r\n1300\t   300\r\n1300\t   280\r\n1300\t   190\r\n1430\t   150\r\n1430\t    90\r\n1430\t    70\r\n1430\t    40\r\n1430\t   908\r\n1430\t  1238\r\n1430\t  3553\r\n1430\t   588\r\n1430\t    73\r\n1430\t 65480\r\n1430\t 19714\r\n1430\t  2756\r\n1430\t}"
#>      [,2]  
#> [1,] "1170"
#>      [,3]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
#> [1,] "1170\t   860\r\n1170\t  5530\r\n1170\t   690\r\n1170\t  1200\r\n1170\t   390\r\n1170\t   740\r\n1170\t   350\r\n1170\t   490\r\n1170\t   360\r\n1170\t   440\r\n1170\t   450\r\n1170\t   580\r\n1170\t   620\r\n1170\t   740\r\n1300\t   730\r\n1300\t   870\r\n1300\t   800\r\n1300\t   850\r\n1300\t   810\r\n1300\t   870\r\n1300\t   830\r\n1300\t   860\r\n1300\t  1050\r\n1300\t   540\r\n1300\t   550\r\n1300\t   300\r\n1300\t   280\r\n1300\t   190\r\n1430\t   150\r\n1430\t    90\r\n1430\t    70\r\n1430\t    40\r\n1430\t   908\r\n1430\t  1238\r\n1430\t  3553\r\n1430\t   588\r\n1430\t    73\r\n1430\t 65480\r\n1430\t 19714\r\n1430\t  2756\r\n1430"

任何帮助表示赞赏。 菲尔
reprex package(v0.2.1)于2018-12-04创建

1 个答案:

答案 0 :(得分:0)

library(stringr)
library(dplyr)

str <- "1170\t{\r\n1170\t   860\r\n1170\t  5530\r\n1170\t   690\r\n1170\t  1200\r\n1170\t   390\r\n1170\t   740\r\n1170\t   350\r\n1170\t   490\r\n1170\t   360\r\n1170\t   440\r\n1170\t   450\r\n1170\t   580\r\n1170\t   620\r\n1170\t   740\r\n1300\t   730\r\n1300\t   870\r\n1300\t   800\r\n1300\t   850\r\n1300\t   810\r\n1300\t   870\r\n1300\t   830\r\n1300\t   860\r\n1300\t  1050\r\n1300\t   540\r\n1300\t   550\r\n1300\t   300\r\n1300\t   280\r\n1300\t   190\r\n1430\t   150\r\n1430\t    90\r\n1430\t    70\r\n1430\t    40\r\n1430\t   908\r\n1430\t  1238\r\n1430\t  3553\r\n1430\t   588\r\n1430\t    73\r\n1430\t 65480\r\n1430\t 19714\r\n1430\t  2756\r\n1430\t}"       

几行:

> str %>% writeLines()
1170    {
1170       860
1170      5530
1170       690

此代码在左侧给出了所有数字:

str_match_all(str, "(\\d{1,})\\t") %>% 
  data.frame(stringsAsFactors = FALSE)  %>% 
  .$X2 %>% 
  as.numeric()