regex - R中的重叠匹配

标签 regex r string dna-sequence stringi

我已经搜索并找到了这个 forum discussion以达到重叠匹配的效果。

我还发现了以下SO关于查找索引来执行此任务的问题,但无法找到任何关于在 R 语言中抓取重叠匹配的简明信息。

我可以在大多数支持 ( PCRE ) 的语言中执行此任务,方法是使用 Positive Lookahead 断言,同时在 Lookahead 内部实现捕获组以捕获重叠匹配。

但是,虽然实际上以我在其他语言中使用的方式执行此操作,但使用 perl=T在 R 中,没有结果。

> x <- 'ACCACCACCAC'
> regmatches(x, gregexpr('(?=([AC]C))', x, perl=T))[[1]]
[1] "" "" "" "" "" "" ""

使用 stringi 也是如此。和 stringr包裹。
> library(stringi)
> library(stringr)
> stri_extract_all_regex(x, '(?=([AC]C))')[[1]]
[1] "" "" "" "" "" "" ""
> str_extract_all(x, perl('(?=([AC]C))'))[[1]]
[1] "" "" "" "" "" "" ""

执行此操作时应返回的正确结果是:
[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"

编辑
  • 我很清楚regmatches不能很好地处理捕获的匹配,但什么 正好在 regmatches 中导致这种行为,为什么没有返回结果? 我正在寻找一个有点详细的答案 .
  • stringistringr软件包无法通过 regmatches 执行此操作?
  • 请随时添加到我的答案中,或者提出与我发现的不同的解决方法。
  • 最佳答案

    标准regmatches不适用于捕获的匹配项(特别是同一字符串中的多个捕获匹配项)。在这种情况下,由于您正在“匹配”前瞻(忽略捕获),因此匹配本身的长度为零。还有一个regmatches()<-可以说明这一点的函数。观察

    x <- 'ACCACCACCAC'
    m <- gregexpr('(?=([AC]C))', x, perl=T)
    regmatches(x, m) <- "~"
    x
    # [1] "~A~CC~A~CC~A~CC~AC"
    

    注意所有字母是如何保存的,我们只是用我们可以观察到的东西替换了零长度匹配的位置。

    我创建了一个 regcapturedmatches()我经常用于此类任务的函数。例如
    x <- 'ACCACCACCAC'
    regcapturedmatches(x, gregexpr('(?=([AC]C))', x, perl=T))[[1]]
    
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
    # [1,] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
    
    gregexpr正在抓取所有数据就好了,因此如果您不想使用此辅助函数,则无论如何您都可以从该对象中提取它。

    关于regex - R中的重叠匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25800042/

    相关文章:

    regex - oracle regex替换(仅保留a-z)

    java - 停止随机化在 Java 中两次选择数组中的相同字符串

    JAVA 正则表达式 :Make nested same values into single group

    使用 for 循环填充向量的 R 问题

    r - dplyr 0.3.0.2 rename() 习惯用法在加载 reshape 包时不稳定

    r - kmeans 提示 "NA/NaN/Inf in foreign function call (arg 1)",什么时候没有?

    arrays - 将字符串拆分为数组并对每个字符 Swift 执行特定操作

    java - 在 java 中,使用 stringName.contains() 不适用于特殊字符代码

    regex - 如何在Lua中编写此正则表达式?

    regex - Lucene正则表达式中的单词边界