REGEX PCRE字符在第2次出现之间

时间:2015-12-02 17:10:52

标签: regex r pcre

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

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

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

我是使用Regex的新手,请有人帮我正确表达。非常感谢任何帮助。

  

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

     

dffdg def efef

     

2016年6月

     

2016年5月

     

2016年6月

3 个答案:

答案 0 :(得分:1)

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

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

Demo

说明:

  • (?s)激活单线选项
  • (?:.*?May 2016){3}匹配May 2016 3次,其中包含随机文字
  • \K会丢弃您与匹配值相匹配的内容
  • .*?匹配任何内容
  • (?=Jun 2016) ......直至Jun 2016
  • 的第一次出现

答案 1 :(得分:1)

有几种方式

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"

答案 2 :(得分:0)

如果可以假设&#34; 2016年5月&#34;和&#34; 2016年6月&#34;替代,前者先行,然后

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 "