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

问题描述 投票:0回答:2

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

"\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

谁能告诉我怎么做?以其他方式做这件事也很好。

谢谢。

r regex web-scraping
2个回答
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分成至少2个空格"\\s{2,}"(这可以避免在单个空格上分裂),或者在"[AP]M"之前通过正面后视并且后跟单词字符(即不是a通过积极的前瞻"(?<=[AP]M)(?=\\w)"的空白。


样本数据

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

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
© www.soinside.com 2019 - 2024. All rights reserved.