【问题标题】:REGEX PCRE characters between 2 nth occurrences第 2 次出现之间的 REGEX PCRE 字符
【发布时间】:2016-03-07 01:16:04
【问题描述】:

我有类似于以下结构的数据。我需要提取第三次出现“2016 年 5 月”和“2016 年 6 月”之间的数据。

我有以下模式(坦率地说)构造不正确(而且它没有带回我想要的字符)。

(.*(?>May 2016)){3}(.*(?=Jun 2016)){3}/s

我是使用正则表达式的新手,请有人帮助我正确表达。

2016 年 5 月 2016 年 6 月 efef 2016 年 5 月 2016 年 6 月 2016 年 5 月

dffdg def efef

2016 年 6 月

2016 年 5 月

2016 年 6 月

【问题讨论】:

  • 如果您认为您的正则表达式不合适,那么您必须给出要匹配的内容的精确 表示。即May_May_May_<here>Jun_Jun_Jun_ 或此类的某种组合。
  • 所以我们可以假设我们有“...... 2016 年 5 月...... 2016 年 6 月...... 2016 年 5 月...... 2016 年 6 月......”等等? IE。他们交替并从五月开始?
  • 你的假设是对的。另外,为不明确表示歉意。我打算从字符串中得到的是May 2016 Jun 2016 May 2016 Jun 2016 May 2016 <here> Jun 2016

标签: regex r pcre


【解决方案1】:

如果有人可以假设“2016 年 5 月”和“2016 年 6 月”交替出现,而前者先出现,那么

x <- "May 2016 A Jun 2016 B May 2016 Jun 2016 May 2016 C Jun 2016 May 2016 Jun 2016"
sub("(.*?May 2016.*?Jun 2016){2}.*?May 2016(.*?)Jun 2016.*", "\\2", x)
[1] " C "

【讨论】:

    【解决方案2】:

    给你(这个需要perl = TRUE):

    (?s)(?:.*?May 2016){3}\K.*?(?=Jun 2016)
    

    Demo

    解释:

    • (?s) 激活单行选项
    • (?:.*?May 2016){3} 匹配 May 2016 3 次,中间有随机文本
    • \K从匹配值中丢弃你迄今为止匹配的内容
    • .*? 匹配任何东西
    • (?=Jun 2016) ...直到第一次出现Jun 2016

    【讨论】:

    • 在必要的修改后可能会有所帮助,以解决在制作 R-regex 模式时需要额外的转义字符。
    • 非常感谢代码和演示的解释。很有帮助。不过,我仍然无法排除月份。我对你的模式做了以下调整(?s)(?:.*?May 2016){3}\K(.*)(?=Jun 2016)Demo
    • 抱歉,我想我自己回答了这个问题。我错过了中间的? (?s)(?:.*?May 2016){3}\K(.*?)(?=Jun 2016) 效果很好
    • @Casimir 非常感谢您纠正了我的愚蠢错误,我不知道我是如何设法错过的,因为解释是针对正确的模式 :)
    【解决方案3】:

    几种方法

    tt <- readLines(textConnection("May 2016 ef Jun 2016 efef May 2016 Jun 2016 May 2016
    
    dffdg def efef
    
    Jun 2016
    
    May 2016
    
    Jun 2016"))
    
    (tt <- paste0(tt, collapse = ''))
    # [1] "May 2016 ef Jun 2016 efef May 2016 Jun 2016 May 2016dffdg def efefJun 2016May 2016Jun 2016"
    
    
    m <- gregexpr('May 2016(.*?)Jun 2016', tt, perl = TRUE)
    mapply(function(x, y) substr(tt, x, x + y - 1),
           attr(m[[1]], 'capture.start'), attr(m[[1]], 'capture.length'))[3]
    # [1] "dffdg def efef"
    
    
    gsub('May.*May.*May 2016(.*?)Jun 2016.*', '\\1', tt)
    # [1] "dffdg def efef"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-25
      • 2015-11-16
      • 1970-01-01
      • 2020-08-30
      • 2014-11-28
      • 2022-10-13
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多