提取字符串的一部分:日期和时间

时间:2019-07-30 11:28:50

标签: r regex date datetime stringr

我有一个变量,通常具有一些乱码,例如:

\n\t\n\t\n\t\n\t\tSeuat eselyt\n\t\t\t\t\t\n\t\t\tti 30.07.2019 klo 12:00 - 14:30\n\t\t\t\t\t\t\tTau ski 2342342 2342342\n\t\t\t\t\t\n\t\n

我正在尝试提取日期(30.07.2019)和时间(12:00-14:30)。我对解析不是很好,因此希望在R中实现此功能有帮助。

4 个答案:

答案 0 :(得分:2)

如果您可以依靠日期和时间部分仅在数据中出现一次的事实,则可以使用正则表达式提取它们(此处使用数据框):

library(tidyverse)
data <-
   tibble(gibberish_string = "\n\t\n\t\n\t\n\t\tSeuat eselyt\n\t\t\t\t\t\n\t\t\tti 30.07.2019 klo 12:00 - 14:30\n\t\t\t\t\t\t\tTau ski 2342342 2342342\n\t\t\t\t\t\n\t\n")

data %>% mutate(date = str_extract(gibberish_string,
                                   pattern = "\\d{1,2}\\.\\d{1,2}\\.\\d{4}"),
                time = str_extract(gibberish_string,
                                   pattern = "\\d{1,2}:\\d{1,2}"))

答案 1 :(得分:1)

将字符串拆分,然后提取日期和时间:

x <- "\n\t\n\t\n\t\n\t\tSeuat eselyt\n\t\t\t\t\t\n\t\t\tti 30.07.2019 klo 12:00 - 14:30\n\t\t\t\t\t\t\tTau ski 2342342 2342342\n\t\t\t\t\t\n\t\n"

lapply(strsplit(x, "[\n\t ]"), function(i){
  dd <- i[ grepl("[0-9]{2}.[0-9]{2}.[0-9]{2}", i) ]
  tt <- i[ grepl("[0-9]{2}:[0-9]{2}", i) ]
  c(dd, paste(tt, collapse = "-"))
})

# [[1]]
# [1] "30.07.2019"  "12:00-14:30"

答案 2 :(得分:1)

此日期:

(\d{1,2}[\.\/]){2}((\d{4})|(\d{2}))

Here is Demo

这是时间:

\d{1,2}:\d{2}\s?-\s?\d{1,2}:\d{2}

Here Is Demo

答案 3 :(得分:1)

一种漫长的循序渐进的base / stringr方法:

tst<-"\n\t\n\t\n\t\n\t\tSeuat eselyt\n\t\t\t\t\t\n\t\t\tti 30.07.2019 klo 12:00 - 14:30\n\t\t\t\t\t\t\tTau ski 2342342 2342342\n\t\t\t\t\t\n\t\n"
 cleaner<-gsub("\\n|\\t","",tst)
 split_txt<-strsplit(cleaner, "\\s(?=[a-z])",perl=T)
 dates<-stringr::str_extract_all(unlist(split_txt),
                         "\\d{1,}\\.\\d{2,}\\.\\d{4}")
 times<-stringr::str_extract_all(stringr::str_remove_all(unlist(split_txt),
                          "[A-Za-z]"),".*\\-.*")
 dates[lengths(dates)>0]
[[1]]
[1] "30.07.2019"

 trimws(times[lengths(times)>0])
[1] "12:00 - 14:30"