正则表达式-第n个'\ n'之后的匹配文本

时间:2019-03-21 01:21:52

标签: r regex web-scraping

我有一个像这样的示例文本:

"\n                                                                                    Apr 15, 2019\n                                                                                12:00 PM – 3:00 PMWMC 2502, Burnaby\n                                        "

我想分别提取日期,时间和位置。

我正在想提取第二个“ \ n”之前的所有内容,这应该给我“ \ n 2019年4月15日”。然后,我可以删除“ \ n”和空格。
然后暂时,我要删除第二个“ \ n”之前的所有内容以及“ PM”之后的所有内容。
对于位置,只需在PM之后保留所有内容,然后删除“ \ n”和空白。

这是我想要的结果:

[1] Apr 15, 2019
[2] 12:00 PM – 3:00 PM
[3] WMC 2502, Burnaby

谁能告诉我该怎么做?也可以通过其他方式做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您的字符串与示例文本共享相同的结构,这应该可以工作。

library(dplyr)
library(stringr)

str_split(x, "\\n", simplify = T) %>%
  trimws() %>%
  as.data.frame() %>%
  mutate(
    time = str_match(V3, "^.+PM"),
    location = gsub(time, "", V3)
  ) %>%
  select(
    date = 2,
    time,
    location
  )

#           date               time          location
# 1 Apr 15, 2019 12:00 PM – 3:00 PM WMC 2502, Burnaby

答案 1 :(得分:0)

这是使用strsplit

的基本R单线
sapply(strsplit(ss, "(\\s{2,}|(?<=[AP]M)(?=\\w))", perl = T), function(x) x[x != ""])    #     [,1]
#[1,] "Apr 15, 2019"
#[2,] "12:00 PM – 3:00 PM"
#[3,] "WMC 2502, Burnaby"

由于样本字符串非常小,很难说这具有多大的概括性。

说明:我们在 上分割ss至少两个空格"\\s{2,}"(避免在单个空格上分割),"[AP]M"之前通过正向后看的位置,然后在单词字符(即非空格)后通过正向"(?<=[AP]M)(?=\\w)"进行后跟的位置。


样本数据

ss <- "\n                                                                                    Apr 15, 2019\n                                                                                12:00 PM – 3:00 PMWMC 2502, Burnaby\n                                        "