Nemal by tento kód fungovať na opakované zisťovanie čísla v R?
> grep(pattern = "\d{2}", x = 1223)
[1] 1
> grep(pattern = "\d{3}", x = 1223)
[1] 1
Ak máme 988, mali by sme sa splniť, a ak by sme mali sfalšovať 123.
Znie to, akoby to nebolo.
> grep(pattern = "\d{2}", x = "1223")
[1] 1
> grep(pattern = "\d{2}", x = "13")
[1] 1
odpovede:
4 pre odpoveď č. 1Musíte použiť spätné odkazy:
> grep(pattern = "(\d)\1", x = "1224")
[1] 1
> grep(pattern = "(\d)\1{1,}", x = "1224")
[1] 1
> grep(pattern = "(\d)\1", x = "1234")
integer(0)
EDIT: Vyzerá to, že musíte zistiť, ako to funguje: (\d)
vytvára a zachytiť skupinu pre \d
, na ktoré sa dá odkazovať pomocou spätného odkazu \1
, Napríklad, ak máte podobné čísla x2y
a chcete nájsť tie, kde x
je rovnaká ako y
, potom:
> grep(pattern = "(\d)2\1", x = "121")
[1] 1
> grep(pattern = "(\d)2\1", x = "124")
integer(0)
Dôrazne odporúčame prečítať si základnú príručku regulárne výrazy.
1 pre odpoveď č. 2
Viem, že otázka výslovne hovorí „pomocou regulárneho výrazu“ v názve, ale tu je metóda bez regulárneho výrazu, ktorá môže fungovať v závislosti od toho, čo chcete urobiť.
strings <- c("1223","1233","1234","113")
# detect consecutive repeat digits, or characters
(strings.rle <- lapply(strings, function(x)rle(unlist(strsplit(x,"")))))
[[1]]
Run Length Encoding
lengths: int [1:3] 1 2 1
values : chr [1:3] "1" "2" "3"
[[2]]
Run Length Encoding
lengths: int [1:3] 1 1 2
values : chr [1:3] "1" "2" "3"
[[3]]
Run Length Encoding
lengths: int [1:4] 1 1 1 1
values : chr [1:4] "1" "2" "3" "4"
[[4]]
Run Length Encoding
lengths: int [1:2] 2 1
values : chr [1:2] "1" "3"
Teraz môžete pracovať strings.rle
robiť, čo chcete
# which entries have consecutive repeat digits, or characters
strings[sapply(strings.rle, function(x) any(x$lengths > 1))]
[1] "1223" "1233" "113"
alebo
# which digits or characters are consecutively repeated?
lapply(strings.rle, function(x) x$values[which(x$lengths > 1)])
[[1]]
[1] "2"
[[2]]
[1] "3"
[[3]]
character(0)
[[4]]
[1] "1"