부정적 예측 : a(?!b)
말한다
unlist(strsplit(xx.1, "_(?!.*_)", perl = TRUE))
# [1] "zz_ZZ_uu" "d" "II_OO" "d"
찾을 그런 다음되지 않은 a
을 b
. 이 경우 .*_
은 더 이상 (.*
)이 더 이상 존재해서는 안되는 것을 의미합니다. _
님.
그러나이 아이디어를 일반화하는 것이 쉽지 않은 것 같습니다. 먼저 _(?=[^_]*$)
으로 긍정적 인 미리보기로 다시 쓸 수 있습니다 (_
뒤에 _
이 오는 것을 찾으십시오. 여기에 $
은 문자열의 끝을 나타냄). 그렇다면 매우 우아하지 않은 일반화가 될 것입니다.
rsplit <- function(x, s, n) {
p <- paste0("[^", s, "]*")
rx <- paste0(s, "(?=", paste(rep(paste0(p, s), n - 1), collapse = ""), p, "$)")
unlist(strsplit(x, rx, perl = TRUE))
}
rsplit(vec, "_", 1)
# [1] "a_b_c_d_e_f" "g" "a" "b"
rsplit(vec, "_", 3)
# [1] "a_b_c_d" "e_f_g" "a_b"
이 경우 n=3
이 함수는 _(?=[^_]*_[^_]*_[^_]*$)
을 사용합니다.
+1 정규식 마술. –
나는 perl에 익숙하지 않다. 조금 설명 할 수 있겠는가? 두 개 이상의 "_"을 분할하고 싶다면 어떻게 바꾸어야 하는가? – shao
@ chunxuan, 업데이트를 참조하십시오. – Julius