【问题标题】:Extracting capturing groups from a regex从正则表达式中提取捕获组
【发布时间】:2015-08-05 21:53:29
【问题描述】:

This regex(.*?)(?:I[0-9]-)*I3(?:-I[0-9])* 匹配使用多个组的表达式。正则表达式的重点在于它以两个成对的形式捕获模式,其中正则表达式的第一部分必须跟在正则表达式的第二部分之后。

如何提取这两个组?

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"

这里的关键是正则表达式匹配两次,每次包含 2 个组。我希望每场比赛都有一个自己的列表,并且该列表包含 2 个元素,每个组一个。

【问题讨论】:

  • 哇......完全误读了这个问题......
  • (?: ... ) 是非捕获组...
  • 你没有两个捕获组..
  • @hwnd:所以帮帮我吧——我该如何修改它来获得两个组?

标签: regex r


【解决方案1】:

您需要在表达式的第二部分周围包装一个捕获组,如果您使用 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2017-10-26
    • 1970-01-01
    • 2022-07-22
    • 2015-07-24
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多