【问题标题】:Regex - matching text after the nth '\n'正则表达式 - 第 n 个 '\n' 之后的匹配文本
【发布时间】:2019-03-21 01:21:52
【问题描述】:

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

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

我想分别提取日期、时间和地点。

我在想的是提取第二个“\n”之前的任何内容,这应该给我“\n Apr 15, 2019”。然后我可以删除“\n”和空格。
然后暂时,我想删除第二个“\n”之前和“PM”之后的所有内容。
对于位置,只需保留 PM 之后的任何内容,然后删除“\n”和空格。

这是我想要的结果:

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

谁能告诉我怎么做?其他方式也可以。

谢谢。

【问题讨论】:

  • 我认为您没有正确添加示例文本。编辑:没关系。没想到全是一行,还有水平滚动。
  • 试试strsplit(INPUT, "\\n")

标签: r regex web-scraping


【解决方案1】:

这是使用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",通过正向后视,后面是一个单词字符(即不是空格),通过正向前瞻"(?&lt;=[AP]M)(?=\\w)"


样本数据

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2015-04-10
      • 2022-12-17
      • 1970-01-01
      相关资源
      最近更新 更多