【问题标题】:Extract text between two dates in R在R中的两个日期之间提取文本
【发布时间】:2023-03-25 21:02:01
【问题描述】:

有一个长文本列,我想提取两个日期之间的字符串。这两个日期是字符串中的最后两个日期。

df <- data.frame (f1  = c("Today is test 2021-09-15", 
                           "This is to be done today. 2020-04-05.Today is going tobe  2021-09-15",
                           "Great Novel. 2018-08-09.This is to be done today. 2020-04-05.The lion is an animal 2021-09-15", 
                           "This is to be done today. 2020-04-05.Today is test 2021-09-01.Monday is the first day 2021-08-02"
                           )
                        
)

预期输出是: 今天是考试 今天将是
狮子是一种动物
星期一是第一天

我能够提取最后两个日期,但不知何故无法提取两个日期之间的文本。如果只有一个日期,那么文本之前的整个文本都会出现。 请指导。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以使用 -

    sub('(?:.*\\d+-\\d+-\\d+\\.)?(.*?)\\s+\\d+-\\d+-\\d+$', '\\1', df$f1)
    
    #[1] "Today is test"           "Today is going tobe"    
    #[3] "The lion is an animal"   "Monday is the first day"
    

    在哪里-

    (?:.*\\d+-\\d+-\\d+\\.) - 是日期的可选非捕获组。它保留为可选,因为第一个值在我们要提取的文本之前没有日期。由于正则表达式是贪婪的,.* 最初确保日期是文本中倒数第二个日期。

    (.*?) 是一个捕获组,它从第一组中提取所有内容,直到文本结束的下一个日期 (\\d+-\\d+-\\d+$)

    【讨论】:

      【解决方案2】:

      你可以试试:

      sub(".*?([^-0-9.]+)[-0-9]+$", "\\1", df$f1)
      #[1] "Today is test "           "Today is going tobe  "   
      #[3] "The lion is an animal "   "Monday is the first day "
      

      其中.*? 匹配所有非贪婪,[^-0-9.] 匹配所有但不匹配-0-9.[-0-9] 匹配-0-9$ 是字符串的结尾。

      【讨论】:

      • 亲爱的 Gk,我可以在这里请求解释。我对非贪婪匹配的机制非常熟悉,但我想知道它是如何理解在倒数第二个日期之前停止的,以便您可以捕获与([^-0-9.]+) 之间的文本?
      • 让我们从右边开始。 [-0-9]+$ 将取最后一个日期,[^-0-9.]+ 将取最后一个日期之前的所有内容,不是日期,.*? 将取其余部分。
      • 所以.*? 这基本上是可能的最短匹配,这要归功于非贪婪匹配,它将匹配到“不是日期”,对吗?
      • 是的。如果您使用.*,它将匹配并采用以下[^-0-9.]也将匹配的内容。
      • 我总是从 Kindermann 先生的解决方案中学到很多东西,因为我一直认为它们是简洁明了的解决方案。感谢您在这里的贡献。
      【解决方案3】:

      您可以使用环视:

      library(stringr)
      str_extract(df$f1, "(?<=\\.|^)\\D+(?=\\s[-\\d]+$)")
      [1] "Today is test"           "Today is going tobe "    "The lion is an animal"   "Monday is the first day"
      

      这是如何工作的:

      • (?&lt;=\\.|^):肯定后向断言目标字符串(在您的情况下为文本)必须以字符串开头(^)或句点.开头
      • \\D+:目标字符串表示为负字符类,允许任何数字
      • 的字符
      • (?=\\s[-\\d]+$):肯定的lookahaed断言目标字符串后面必须跟一个空格,后面跟-和数字的任意组合和数量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 2023-04-08
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多