代码之家  ›  专栏  ›  技术社区  ›  Ferdinand.kraft

从正则表达式中提取捕获组匹配项?(或者:gregexec在哪里?)

  •  13
  • Ferdinand.kraft  · 技术社区  · 13 年前

    给定一个包含 capture groups (括号)和一个字符串,如何获得 全部的 与捕获组匹配的子字符串,即通常由“\1”、“\2”引用的子字符串?

    示例:考虑一个正则表达式捕获以“xy”开头的数字:

    s <- "xy1234wz98xy567"
    
    r <- "xy(\\d+)"
    

    期望结果:

    [1] "1234" "567" 
    

    首次尝试: gregexpr :

    regmatches(s,gregexpr(r,s))
    #[[1]]
    #[1] "xy1234" "xy567" 
    

    不是我想要的,因为它返回与整个模式匹配的子字符串。

    第二次尝试: regexec :

    regmatches(s,regexec("xy(\\d+)",s))
    #[[1]]
    #[1] "xy1234" "1234" 
    

    不是我想要的,因为它回来了 只有 第一次出现整个图案和捕获组的匹配。

    如果有 gregexec 函数,扩展 正则表达式 gregexpr公司 延伸 regexpr ,我的问题就会得到解决。

    所以问题是:如何检索所有子字符串(或可以传递给的索引 regmatches 如上面的例子中那样)匹配任意正则表达式中的捕获组?

    注意:的模式 r 上面给出的只是一个愚蠢的例子,它必须保持任意性。

    4 回复  |  直到 13 年前
        1
  •  12
  •   Josh O'Brien    13 年前

    对于基本的R解决方案,只使用 gsub() 以完成对由提取的字符串的处理 gregexpr() regmatches() ?

    s <- "xy1234wz98xy567"
    r <- "xy(\\d+)"
    
    gsub(r, "\\1", regmatches(s,gregexpr(r,s))[[1]])
    # [1] "1234" "567" 
    
        2
  •  11
  •   bschneidr    8 年前

    不确定是否要在基础上这样做,但这里有一个满足您需求的包:

    library(stringr)
    
    str_match_all(s, r)
    #[[1]]
    #     [,1]     [,2]  
    #[1,] "xy1234" "1234"
    #[2,] "xy567"  "567" 
    

    许多的 stringr 函数在基R中也有相似之处,因此您也可以在不使用 字符串 .

    例如,以下是上述工作原理的简化版本,使用基本R:

    sapply(regmatches(s,gregexpr(r,s))[[1]], function(m) regmatches(m,regexec(r,m)))
    
        3
  •  8
  •   G. Grothendieck    13 年前

    strapplyc gsubfn package 这样做:

    > library(gsubfn)
    >
    > strapplyc(s, r)
    [[1]]
    [1] "1234" "567" 
    

    尝试 ?strapplyc 了解更多信息和示例。

    相关功能

    1) 的概括 系带 strapply 在同一包装中。它采用一个函数,该函数输入每个匹配的捕获部分,并返回函数的输出。当函数为 c 它减少到 系带 例如,假设我们希望以数字形式返回结果:

    > strapply(s, r, as.numeric)
    [[1]]
    [1] 1234  567
    

    2) gsubfn 是同一程序包中的另一个相关函数。就像 gsub 除了替换字符串可以是替换函数(或替换列表或替换原型对象)。替换功能输入捕获的部分并输出替换。替换将替换输入字符串中的匹配项。如果使用公式,如本例所示,则将公式的右侧视为函数体。在本例中,我们将匹配项替换为 XY{#} 其中#是匹配的输入数字的两倍。

    > gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
    [1] "XY{2468}wz98XY{1134}"
    

    更新: 补充 系带 gsubfn公司 例如。

        4
  •  0
  •   starja    3 年前

    由于R 4.1.0 gregexec :

    regmatches(s,gregexec(r,s))[[1]][2, ]
    [1] "1234" "567"
    
    推荐文章