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

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

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

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

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



답변

몇 가지 방법이 있습니다.

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")


답변

예를 들어 gsub또는sub

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


답변

여기 또 다른 간단한 대답이 있습니다

gsub("^.*:","", string)


답변

파티에 늦었지만 후손을 위해 스트링거 패키지 (인기있는 “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"


답변

이것은해야합니다 :

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

준다

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


답변

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

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


답변

unglue 패키지는 대안을 제공, 정규 표현식에 대한 지식이 간단한 경우 필요하지 않습니다, 우리가 할 거라고 :

# install.packages("unglue")
library(unglue)
string = c("G1:E001", "G2:E002", "G3:E003")
unglue_vec(string,"{x}:{y}", var = "y")
#> [1] "E001" "E002" "E003"

reprex 패키지 (v0.3.0)로 2019-11-06에 작성

자세한 정보 : https://github.com/moodymudskipper/unglue/blob/master/README.md