我的数据类似于以下结构。我需要提取第三次出现的“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月
答案 0 :(得分:1)
你要去(这个perl = TRUE
):
(?s)(?:.*?May 2016){3}\K.*?(?=Jun 2016)
说明:
(?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 "