r语言 - 正则表达式 - 捕获重复组,不包括周围的部分匹配内容



作为记录,我使用的是R,但我的查询是独立于平台的(就目前而言(,所以我将使用regex101进行演示。我试图捕捉重复的组,这些组可能会也可能不会被其他文本包围。因此,此演示显示了理想的行为: 演示1

正则表达式:(d{2})(AB)

文本:blahblah11AB12AB13ABblah

因此,它很好地捕获了我想要的所有组:

匹配 1

Full match  8-12    `11AB`
Group 1.    8-10    `11`
Group 2.    10-12   `AB`

匹配 2

Full match  12-16   `12AB`
Group 1.    12-14   `12`
Group 2.    14-16   `AB`

三消

Full match  16-20   `13AB`
Group 1.    16-18   `13`
Group 2.    18-20   `AB`

但是,如果我包含另一段匹配的文本,它也会捕获它(我想这很公平(

文本:blahblah11AB12AB13ABblah22AB返回相同但带有额外组:

匹配 4

Full match  24-28   `22AB`
Group 1.    24-26   `22`
Group 2.    26-28   `AB`

演示2

我想做的是捕获第一组,但忽略所有其他文本,即使有后续匹配。从本质上讲,我只想从这篇文章中得到三个匹配项:blahblah11AB12AB13ABblah22AB

我已经尝试了很多事情,例如:(((d{2})(AB))+)(.*)

但是后来我得到以下内容,它丢失了所有最后的组捕获:

演示 3

匹配 1

Full match  8-28    `11AB12AB13ABblah22AB`
Group 1.    8-20    `11AB12AB13AB`
Group 2.    16-20   `13AB`
Group 3.    16-18   `13`
Group 4.    18-20   `AB`
Group 5.    20-28   `blah22AB`

我需要一些保留重复组的东西。我被难住了!

在 R 中,输出应如下所示:

[[1]]
[,1]   [,2] [,3]
[1,] "11AB" "11" "AB"
[2,] "12AB" "12" "AB"
[3,] "13AB" "13" "AB"

提前感谢...

一个想法是使用G将比赛链接起来,以^开始并在之后K重置。

(?:^.*?K|G)(d{2})(AB)
  • ^.*?K将在第一次匹配之前懒惰地匹配任意数量的任意字符
  • |G或继续在上一场比赛结束时,可以是:开始,第一,上一个

查看更新的演示

这将匹配第一个火柴链,并且是 pcre 模式 (perl=TRUE(。
如果在第一次匹配之前只能有非数字,请使用^D*K而不是^.*?K

您可以使用量词{3}来获取 3 个第一组:(((d{2})(AB)){3}).查看演示

如果我理解正确,问题出在括号的位置上。

pattern <- "(\d{2}AB)"
s <- "blahblah11AB12AB13ABbla"
m <- gregexpr(pattern, s)
regmatches(s, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"

s2 <- "blahblah11AB12AB13ABblah22AB"
s3 <- "11AB12AB13ABblah22AB"
S <- c(s, s2, s3)
m <- gregexpr(pattern, S)
regmatches(S, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"
#
#[[2]]
#[1] "11AB" "12AB" "13AB" "22AB"
#
#[[3]]
#[1] "11AB" "12AB" "13AB" "22AB"

请注意,很多时候它只在一个代码行中运行。我这样离开是为了更清楚。

编辑。

也许以下内容可以满足OP的要求。
我敢打赌有更好的解决方案,在我看来,两个正则表达式是矫枉过正的。

pattern <- "((\d{2}AB)+)([^[:digit:]AB]+(\d{2}AB))"
pattern2 <- "(\d{2}AB)"
m <- gregexpr(pattern2, gsub(pattern, "\1", S))
regmatches(S, m)
#[[1]]
#[1] "11AB" "12AB" "13AB"
#
#[[2]]
#[1] "11AB" "12AB" "13AB"
#
#[[3]]
#[1] "11AB" "12AB" "13AB"

最新更新