正则表达式 – R中的重叠匹配

前端之家收集整理的这篇文章主要介绍了正则表达式 – R中的重叠匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经搜索,并且能够找到这个 forum discussion,以达到重叠比赛的效果.

我还发现了以下SO问题,提到查找索引来执行此任务,但是无法找到任何简明扼要的R语言中的重叠匹配.

我可以在大多数支持(PCRE)的任何语言中执行此任务,通过使用正向前置断言,同时在前瞻性内部实现捕获组以捕获重叠的匹配.

但是,实际执行方式和其他语言一样,在R中使用perl = T,没有结果产生.

> 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不能很好地工作,但究竟是什么原因导致了这种行为,为什么还没有返回任何结果?我清醒一些有些详细的答案.
> stringi和stringr包是否不能执行这个超过regmatches?
>请随意添加到我的答案或提出一个不同于我发现的解决方法.

捕获的匹配(特别是同一字符串中的多个捕获的匹配)的标准规则不能正常工作.而在这种情况下,由于您是“匹配”前瞻(忽略捕获),所以匹配本身是零长度的.还有一个可以说明这一点的regmatches()< - 函数. Obseerve
x <- 'ACCACCACCAC'
m <- gregexpr('(?=([AC]C))',perl=T)
regmatches(x,m) <- "~"
x
# [1] "~A~CC~A~CC~A~CC~AC"

注意所有的字母是否被保留,我们只是用可以观察到的零长度匹配的位置替换.

我创建了一个我经常用于这样的任务的regcapturedmatches()功能.例如

x <- 'ACCACCACCAC'
regcapturedmatches(x,perl=T))[[1]]

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,] "AC" "CC" "AC" "CC" "AC" "CC" "AC"

gregexpr正在抓取所有的数据,所以你可以从对象中提取它,无论如何,如果你不想使用这个帮助函数,你的生活.

猜你在找的正则表达式相关文章