[regex] 정규식 일치 추출

문자열에서 숫자를 추출하려고합니다.

그리고 [0-9]+문자열에서 같은 것을 "aaa12xxx"하고 "12".

나는 그것이 다음과 같을 것이라고 생각했습니다.

> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"

그리고 나는 생각했다 …

> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"

하지만 다음과 같은 응답을 받았습니다.

> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"

내가 놓친 작은 세부 사항이 있습니다.



답변

기존 정규식을 모두 래핑하는 새 stringr 패키지를 사용하여 일관된 구문으로 작동하고 누락 된 몇 가지를 추가합니다.

library(stringr)
str_locate("aaa12xxx", "[0-9]+")
#      start end
# [1,]     4   5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"


답변

표준 기능 무시 ‘라고 말하는 것은 조금 서두르다 ?gsub. ‘참조’에서 특별히 참조 하는 도움말 파일 :

‘regexpr’, ‘gregexpr’및 ‘regexec’의 결과를 기반으로 일치하는 부분 문자열을 추출하기위한 ‘regmatches’.

따라서 이것은 작동하고 매우 간단합니다.

txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"


답변

아마도

gsub("[^0-9]", "", "aaa12xxxx")
# [1] "12"


답변

PERL 정규식의 지연 일치를 사용할 수 있습니다.

> sub(".*?([0-9]+).*", "\\1", "aaa12xx99",perl=TRUE)
[1] "12"

이 경우 숫자가 아닌 것을 대체하려고하면 오류가 발생합니다.


답변

한 가지 방법은 다음과 같습니다.

test <- regexpr("[0-9]+","aaa12456xxx")

이제 regexpr이 문자열의 시작 및 끝 인덱스를 제공합니다.

    > test
[1] 4
attr(,"match.length")
[1] 5

따라서 해당 정보를 substr 함수와 함께 사용할 수 있습니다.

substr("aaa12456xxx",test,test+attr(test,"match.length")-1)

이 작업을 수행하는 더 우아한 방법이 있다고 확신하지만 이것이 제가 찾을 수있는 가장 빠른 방법이었습니다. 또는 sub / gsub를 사용하여 원하는 것을 남기고 싶지 않은 것을 제거 할 수 있습니다.


답변

정규식에 캡처 링 괄호를 사용하고 대체에 그룹 참조를 사용합니다. 괄호 안의 모든 것이 기억됩니다. 그런 다음 첫 번째 항목 인 \ 2에 의해 액세스됩니다. 첫 번째 백 슬래시는 R에서 백 슬래시의 해석을 이스케이프하여 정규식 파서로 전달됩니다.

gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")


답변

gsubfn 패키지에서 strapply 사용. strapply는 객체가 (배열이 아닌) 문자열의 벡터이고 수정자가 (여백이 아닌) 정규 표현식이라는 점을 제외하고는 인수가 객체, 수정 자 및 함수라는 점에서 apply와 같습니다.

library(gsubfn)
x <- c("xy13", "ab 12 cd 34 xy")
strapply(x, "\\d+", as.numeric)
# list(13, c(12, 34))

이것은 as.numeric을 통해 각 일치를 전달하는 x의 각 구성 요소에서 하나 이상의 숫자 (\ d +)를 일치시킵니다. 구성 요소가 x의 각 구성 요소와 일치하는 벡터 인 목록을 반환합니다. at 출력을 보면 x의 첫 번째 구성 요소에는 13 인 일치 항목이 하나 있고 x의 두 번째 구성 요소에는 12와 34 인 일치 항목이 두 개 있음을 알 수 있습니다 . 자세한 내용은 http://gsubfn.googlecode.com 을 참조하세요.