当前位置: 首页 > 知识库问答 >
问题:

从regex中提取捕获组

邢寒
2023-03-14

此regex:(.*?)(?:i[0-9]-)*i3(?:-i[0-9])*使用多个组匹配表达式。regex的要点是它捕获两个成对的模式,其中regex的第一部分必须跟在regex的第二部分后面。

如何提取这两个组中的每一个?

library(stringr)
data <- c("A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7")
str_extract_all(data, "(.*?)(?:I[0-9]-)*I3(?:-I[0-9])*")
[[1]]
[1] "A-B-C-I1-I2-D-E-F-I1-I3"          "-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7"
[[1]]
[1] "A-B-C-I1-I2-D-E-F" [2] "I1-I3"
[[2]]
[1] "D-D-D-D" [2] "I1-I1-I2-I1-I1-I3-I3-I7"

这里的关键是regex匹配两次,每次包含2个组。我希望每个匹配都有一个它自己的列表,这个列表包含2个元素,每个组一个。

共有1个答案

邹正阳
2023-03-14

您需要在表达式的第二部分包装一个捕获组,如果您使用stringr来完成此任务,我将使用str_match_all来返回捕获的匹配项...

library(stringr)

data <- c('A-B-C-I1-I2-D-E-F-I1-I3-D-D-D-D-I1-I1-I2-I1-I1-I3-I3-I7')
mat <- str_match_all(data, '-?(.*?)-((?:I[0-9]-)*I3(?:-I[0-9])*)')[[1]][,2:3]
colnames(mat) <- c('Group 1', 'Group 2')

#      Group 1             Group 2                  
# [1,] "A-B-C-I1-I2-D-E-F" "I1-I3"                  
# [2,] "D-D-D-D"           "I1-I1-I2-I1-I1-I3-I3-I7"
 类似资料:
  • 我正在试图理解这个代码块。在第一个中,我们在表达式中寻找的是什么? 我的理解是,它是任何一个字符(0或多个*),后面跟0到9之间的任何一个数字(一个或多个+),后面跟任何一个字符(0或多个*)。 执行此操作时,结果为: 使用抓取群的好处是什么?

  • 我有下面的台词, 所以,如果我再加上两个括号,比如:那么,会有两个组吗?将返回部分,而返回部分? 代码段是为了澄清我的困惑而给出的。不是我处理的代码。上面给出的代码可以用以更简单的方式完成。

  • 问题内容: 我正在解析CSS,以便从链接的样式表中获取URL。这是一个Java应用程序。( 我尝试使用CSSParser( http://cssparser.sourceforge.net/ ),但是,它在解析时会默默地删除许多规则。) 所以我只是在使用Regex。我想要一个仅获取URL的正则表达式,并且足够健壮以应对来自狂野的真实CSS: 你明白了。这是在Java的regex实现中( 不是我的最

  • 问题内容: 我需要在python中编写一个正则表达式以从Tweets中提取提及。 我的尝试: 对于@mickey之类的任何提及,它都可以正常工作,但是,在带有@mickey_mouse之类的下划线的提及中,它仅提取@mickey。 如何修改正则表达式以使其在两种情况下均能正常工作? 谢谢 问题答案: 在下一组添加下划线,如下所示: Regex101演示 另外,Twitter Handle规则 允许

  • 美化的json响应: } 我需要提取docId、id、nameId,因为我总是知道代码。 添加了groovy脚本来设置参数: