使用正则表达式

时间:2016-04-14 10:39:45

标签: regex r lapply

我有以下排序列表(第一个)时间段,我想将期间分成特定日期,然后提取最大时间段而不改变列表的顺序。

$`1`
[1] "01.12.2015 - 21.12.2015"

$`2`
[1] "22.12.2015 - 05.01.2016"

$`3`
[1] "14.09.2015 - 12.10.2015" "29.09.2015 - 26.10.2015"

因此,调整后的列表应如下所示:

$`1`
[1] "01.12.2015" "21.12.2015"

$`2`
[1] "22.12.2015"  "05.01.2016" 

$`3`
[1] "14.09.2015"  "12.10.2015" "29.09.2015"  "26.10.2015"

为了做到这一点,我开始拆分清单:

   lst_split <- str_split(lst, pattern = " - ")

导致以下内容:

[[1]]
[1] "01.12.2015" "21.12.2015"

[[2]]
[1] "22.12.2015" "05.01.2016"

[[3]]
[1] "c(\"14.09.2015"             "12.10.2015\", \"29.09.2015" "26.10.2015\")"  

然后,我尝试提取模式:

lapply(lst_split, function(x) str_extract(pattern = c("\\d+\\.\\d+\\.\\d+"),x))

但我的输出缺少一个日期(29.09.2015)

[[1]]
[1] "01.12.2015" "21.12.2015"

[[2]]
[1] "22.12.2015" "05.01.2016"

[[3]]
[1] "14.09.2015" "12.10.2015" "26.10.2015"

有没有人知道如何才能让它发挥作用并提出更有效的解决方案?提前谢谢。

2 个答案:

答案 0 :(得分:2)

感谢@WiktorStribiżew和@akrun的评论,使用str_extract_all即可。

在这个例子中:

> str_extract_all(lst,"\\d+\\.\\d+\\.\\d+")
[[1]]
[1] "01.12.2015" "21.12.2015"

[[2]]
[1] "22.12.2015" "05.01.2016"

[[3]]
[1] "14.09.2015" "12.10.2015" "29.09.2015" "26.10.2015"

答案 1 :(得分:1)

1)使用strsplit,使用unlist展平每个组件,将日期转换为"Date"类,然后使用range获取最长时间跨度。没有包使用。

> lapply(lst, function(x) range(as.Date(unlist(strsplit(x, " - ")), "%d.%m.%Y")))
$`1`
[1] "2015-12-01" "2015-12-21"

$`2`
[1] "2015-12-22" "2016-01-05"

$`3`
[1] "2015-09-14" "2015-10-26"

2)使用magrittr管道的这种变化也有效:

library(magrittr)
lapply(lst, function(x) 
   x %>% 
     strsplit(" - ") %>% 
     unlist %>% 
     as.Date("%d.%m.%Y") %>% 
     range
)

注意:可重复形式的输入lst为:

lst <- structure(list(`1` = "01.12.2015 - 21.12.2015", `2` = "22.12.2015 - 05.01.2016", 
`3` = c("14.09.2015 - 12.10.2015", "29.09.2015 - 26.10.2015"
)), .Names = c("1", "2", "3"))