패턴에 따라 부분 문자열 추출


136

문자열 목록이 있다고 가정하십시오.

string = c("G1:E001", "G2:E002", "G3:E003")

이제 콜론 ":"뒤에있는 부분 만 포함하는 문자열 벡터를 얻으려고합니다 substring = c(E001,E002,E003).

R에 이것을 수행하는 편리한 방법이 있습니까? 사용 substr?

답변:


239

몇 가지 방법이 있습니다.

1) 하위

sub(".*:", "", string)
## [1] "E001" "E002" "E003"

2) strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"

3) 읽은 테이블

read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"

4) 부분 문자열

이것은 두 번째 부분이 항상 네 번째 문자로 시작한다고 가정합니다 (이 예제의 경우).

substring(string, 4)
## [1] "E001" "E002" "E003"

4a) 부분 문자열 / 정규식

콜론이 항상 알려진 위치에 있지 않은 경우 콜론을 검색하여 (4)를 수정할 수 있습니다.

substring(string, regexpr(":", string) + 1)

5) 스트랩

strapplyc 괄호로 묶은 부분을 반환합니다.

library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"

6) read.dcf

이것은 콜론 이전의 하위 문자열이 고유 한 경우에만 작동합니다 (문제의 예에 있음). 또한 구분 기호는 콜론이어야합니다 (문제에 있습니다). 다른 구분 기호를 사용한 경우 먼저 구분 기호를 sub콜론으로 바꾸는 데 사용할 수 있습니다 . 예를 들어, 세퍼레이터 경우였다 _그때string <- sub("_", ":", string)

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"

7) 분리

7A) 하여 tidyr::separate우리가 두 개의 열, 결장 앞부분 용과 후 하나와 데이터 프레임을 생성하고, 후자를 추출한다.

library(dplyr)
library(tidyr)
library(purrr)

DF <- data.frame(string)
DF %>% 
  separate(string, into = c("pre", "post")) %>% 
  pull("post")
## [1] "E001" "E002" "E003"

7B) 대안은 separate단지 만드는 데 사용할 수있는 post열 다음 unlistunname결과 데이터 프레임 :

library(dplyr)
library(tidyr)

DF %>% 
  separate(string, into = c(NA, "post")) %>% 
  unlist %>%
  unname
## [1] "E001" "E002" "E003"

8) trimws 우리가 사용할 수있는 trimws결장을 잘라 다시 사용 후 왼쪽 떨어져 트림 단어 문자와.

trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"

노트

입력 string은 다음과 같습니다.

string <- c("G1:E001", "G2:E002", "G3:E003")

I는 것으로 용융 테이블의 변수를 가지고 _세퍼레이터 같이 두 개의 별도의 변수를 만들어 접두사 및 접미사 @Grothendieck 응답에 기초하여 : prefix <- sub("_.*", "", variable)suffix <- sub(".*_", "", variable)
swihart

이 놀라운 답변의 마이크로 벤치마킹을 보는 것이 좋을 것입니다!
patL

25

예를 들어 gsub또는sub

    gsub('.*:(.*)','\\1',string)
    [1] "E001" "E002" "E003"

당신은 이것들을 설명 할 수 있습니까? * (* 등등 정확히 거기에 있습니까? 나는 이것을 약간 다른 설정으로 재현하는데 어려움을 겪고 있습니다 ...
Peter Pan

1
@PeterPan 콜론 다음에 나타나는 문자 그룹을 캡처하여 반환합니다. 일치하는 문자열이 더 복잡하고 기본 R에 머무르고 싶다면 잘 작동합니다.
Clark Fitzgerald


9

파티에 늦었지만 후손을 위해 스트링거 패키지 (인기있는 "tidyverse"패키지 제품군의 일부)는 이제 문자열 처리를 위해 조화 된 서명이있는 기능을 제공합니다.

string <- c("G1:E001", "G2:E002", "G3:E003")
# match string to keep
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"

# replace leading string with ""
stringr::str_remove(string = string, pattern = "^.*:")
# [1] "E001" "E002" "E003"

2
이것이 콜론 뒤의 모든 것이 아니라 E로 시작하는 첫 번째 숫자를 찾는 것이 아닙니까?
마크 닐

6

이것은해야합니다 :

gsub("[A-Z][1-9]:", "", string)

준다

[1] "E001" "E002" "E003"

3

당신이 사용하는 경우 data.table다음 tstrsplit()자연 선택이 될 것입니다 :

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.