這個問題是從那個問題Function衍生出來的,用于對字串向量中的連續數字進行計數。
假設我有這樣的字串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}"
并輸入patt到str_detect,這僅檢測第一個選擇,即(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
非常感謝有關此事的建議!
uj5u.com熱心網友回復:
在您的模式中(2)\\1{1}|(3)\\1{2}|(4)\\1{3}|(5)\\1{4},量詞重復將反向參考匹配到第一個捕獲組。這就是為什么你只匹配第一個選項。
您可以改為重復下一個捕獲組,因為有多個組。
(2)\\1{1}|(3)\\2{2}|(4)\\3{3}|(5)\\4{4}
本(2)\\1{1}可以只是(2)\\1但這是不錯的方法,你組裝模式動態
uj5u.com熱心網友回復:
那這個呢?
> grepl(
paste0(sapply(2:5, function(i) sprintf("(%s)\\%s{%s}", i, i - 1, i - 1)), collapse = "|"),
x
)
[1] FALSE TRUE FALSE FALSE TRUE TRUE
或者
> rowSums(sapply(2:5, function(i) grepl(sprintf("(%s)\\1{%s}", i, i - 1), x))) > 0
[1] FALSE TRUE FALSE FALSE TRUE TRUE
uj5u.com熱心網友回復:
如評論中所述,您需要更新正則運算式:
patt = paste0(
"(", digits, ")\\", digits - 1, "{", digits - 1, "}",
collapse = "|"
)
str_detect(x, patt)
輸出:
[1] FALSE TRUE FALSE FALSE TRUE TRUE
在您的for回圈中,您res每次都進行替換,因此當您最后列印res時,您會看到 wheni為 5的結果。如果您print()改為使用:
for(i in 2:5){
print(str_detect(x, paste0("(", i, ")\\1{", i - 1, "}")))
}
輸出:
[1] FALSE FALSE FALSE FALSE TRUE FALSE
[1] FALSE TRUE FALSE FALSE FALSE FALSE
[1] FALSE FALSE FALSE FALSE FALSE TRUE
[1] FALSE FALSE FALSE FALSE FALSE FALSE
如果你想使用回圈:
map_lgl(x, function(str) {
any(map_lgl(
2:5,
~ str_detect(str, paste0("(", .x, ")\\1{", .x - 1, "}"))
))
})
輸出:
[1] FALSE TRUE FALSE FALSE TRUE TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/398901.html
上一篇:匹配數字中特定模式以外的所有內容
下一篇:替換R中字串末尾的點
