객관적인:
겹침이 허용 된 문자열에서 패턴의 모든 위치 (시작 및 끝 인덱스)를 찾습니다.
접근하다:
이 stri_locate_all_*
함수는 문자열에서 패턴의 위치 목록을 반환합니다. 목록에는 각 일치 위치에 대한 시작 인덱스와 끝 인덱스가 포함 된 행렬이 포함됩니다. 이것은 내 목적에 편리합니다.
고정 패턴의 경우 다음이 잘 작동합니다.
s <- "---"
pattern <- "--"
stri_locate_all_fixed(s, pattern, overlap = TRUE)
[[1]]
start end
[1,] 1 2
[1,] 2 3
문자열 "s"에 패턴 "-"이 두 번 나타납니다. 첫 번째는 s의 인덱스 1에서 시작하여 인덱스 2에서 끝납니다. 두 번째는 인덱스 2에서 시작하여 인덱스 3에서 끝납니다.
--
-
---
그러나 제 경우에는 패턴이 여러 개의 허용 가능한 문자 (순서 또는 조합)로 구성 될 수 있으며 패턴의 길이가 변경 될 수 있습니다. 따라서 "정규식"이 "고정"보다 적절 해 보입니다.
"-"와 "1"의 조합 (즉, "-1", "1-", "-", "11")과 stri_locate_all_regex
.
pattern <- "[1|-]{2}"
s <- "-1-"
stri_locate_all_regex(s, pattern)
[[1]]
start end
[1,] 1 2
주 stri_locate_all_regex
패턴이 조정해야합니다, 그래서 내가 중복을 캡처 할 경우, 중복 속성을 사용하지 않습니다.
다양한 출처에 따르면 정규식에 긍정적 인 예견을 추가해야합니다.
pattern <- "(?=[1|-]{2})"
이 패턴은 패턴 의 겹치는 발생을 찾아야 합니다 (그리고 regex101 테스터 에서 테스트 할 때 수행합니다 ).
그러나 stri_locate_all_regex
반환 값을 사용할 때 내가 찾고있는 것이 아닙니다.
stri_locate_all_regex("---", "(?=[1|-]{2})")
[[1]]
start end
[1,] 1 0
[2,] 2 1
여기서 함수는 두 개의 일치 항목이 있음을 올바르게 식별하고 시작 인덱스를 기록했지만 종료 인덱스가 시작 인덱스보다 낮습니다.
Stringi 문서 상태 :
"stri_locate _ * _ regex의 경우 일치 길이가 0이면 끝은 시작보다 한 문자가 적습니다."
이것은 일치하는 길이가 0임을 나타냅니다. 이 관찰은 regex "lookarounds"에 대한 다음 설명에 의해 추가로 지원됩니다 .
"Lookahead와 lookbehind는 총칭하여"lookaround "라고하며 길이가 0 인 어설 션입니다. lookaround는 실제로 문자와 일치하지만 일치를 포기하고 결과 만 반환합니다. 일치 또는 일치하지 않음."
따라서 내 문제는 "시작"색인에서 길이가 0 인 위치를 반환하는 것처럼 보이는 긍정적 인 예견 주장을 사용하는 것 같습니다.
내 증류 된 질문 :
-겹치는 (길이가 0이 아닌) 일치 항목을 캡처하는 더 나은 정규 표현식 방법이 있습니까? 또는,
- stri_locate_all_regex
원하는 출력을 얻는 것보다 더 나은 r 함수가 있습니까 (문자열에서 일치하는 패턴의 모든 시작 / 종료 위치 목록)
감사!
gregexpr
전체 긍정 예측 패턴을 포함하는 캡처 그룹과 함께 및 PCRE 정규식을 사용할 수 있습니다 .
pattern <- "(?=([1-]{2}))"
s <- "-1-"
res <- gregexpr(pattern, s, perl=TRUE)
starts <- attr(res[[1]],'capture.start')
lengths <- attr(res[[1]],'capture.length')
ends <- starts + lengths - 1
df_positions <- do.call(rbind, Map(data.frame, start=starts, end=ends, length=lengths))
df_positions
산출:
start end length
1 1 2 2
2 2 3 2
참조 R 데모
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다