[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
열 다음 unlist
과 unname
결과 데이터 프레임 :
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