【发布时间】:2021-12-30 09:55:28
【问题描述】:
这个问题是从那个问题Function to count of consecutive digits in a string vector 衍生出来的。
假设我有 x 之类的字符串:
x <- c("555123", "57333", "21112", "12345", "22144", "44440")
并且想要检测那些在2 和5 之间的任何数字在立即重复中出现的次数与其自身一样多的字符串。也就是说,如果字符串包含22、333、4444 和55555,则匹配。
如果我使用反向引用以小块的方式处理此任务,一切都很好:
str_detect(x, "(2)\\1{1}")
[1] FALSE FALSE FALSE FALSE **TRUE** FALSE
str_detect(x, "(3)\\1{2}")
[1] FALSE **TRUE** FALSE FALSE FALSE FALSE
str_detect(x, "(4)\\1{3}")
[1] FALSE FALSE FALSE FALSE FALSE **TRUE**
但是,如果我使用具有允许数字的向量为所有匹配项寻求单一解决方案:
digits <- 2:5
还有一个交替模式,例如:
patt <- paste0("(", digits, ")\\1{", digits - 1, "}", collapse = "|")
patt
[1] "(2)\\1{1}|(3)\\1{2}|(4)\\1{3}|(5)\\1{4}"
并在str_detect中输入patt,这只会检测到第一个替代方案,即(2)\\1{1}:
str_detect(x, patt)
[1] FALSE FALSE FALSE FALSE **TRUE** FALSE
是不能在交替模式中使用的反向引用吗?如果是这样,那么为什么 for 循环遍历每个选项单独也不起作用?
res <- c()
for(i in 2:5){
res <- str_detect(x, paste0("(", i, ")\\1{", i - 1, "}"))
}
res
[1] FALSE FALSE FALSE FALSE FALSE FALSE
非常感谢您就此事提出建议!
【问题讨论】:
-
我认为反向引用也应该增加,因为你有更多的组
(2)\1|(3)\2{2}|(4)\3{3}|(5)\4{4} -
是的,太棒了!此模式有效:
paste0("(", digits, ")\\", c(1, digits), "{", digits - 1, "}", collapse = "|")。请作为答案发布,以便我接受。 -
我已经发布了一个关于正则表达式的答案。 R 解决方案可能会发布更好的答案,因为我对 R 的了解最少。