programing

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

muds 2023. 6. 20. 21:54
반응형

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

문자열 목록이 있다고 가정합니다.

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

이제 저는 콜론 ":", 즉 다음 부분만 포함하는 문자열의 벡터를 얻기를 바랍니다.substring = c(E001,E002,E003).

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

다음은 몇 가지 방법입니다.

하위의

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

스트르스플릿

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

읽기 테이블

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

서브스트링

여기에서는 두 번째 부분이 항상 네 번째 문자로 시작한다고 가정합니다(문제의 예와 같습니다).

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

4a) 하위 문자열/ 정규식

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

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

스트래플릭

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

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

read.dcf

이것은 콜론 이전의 하위 문자열이 고유한 경우에만 작동합니다(문제의 예에 있음).또한 구분 기호가 콜론이어야 합니다(문제에 나와 있음).만약 다른 분리기가 사용된다면 우리는 사용할 수 있습니다.sub먼저 결장으로 대체합니다.예를 들어, 구분 기호가_그리고나서string <- sub("_", ":", string)

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

별개의

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"

사용할 수 있는 트림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"

파티에 늦었지만, 후손들을 위해, stringr 패키지(인기있는 "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("^.*:","", string)

이 작업은 다음을 수행해야 합니다.

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

기브즈

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

사용 중인 경우data.table그리고나서tstrsplit()자연스러운 선택입니다.

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

unglu 패키지는 간단한 경우 정규식에 대한 지식이 필요하지 않은 대안을 제공합니다. 여기서는 다음을 수행합니다.

# 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

하위 문자열을 추출하는 다른 방법

library(stringr)
substring <- str_extract(string, regex("(?<=:).*"))
#[1] "E001" "E002" "E003
  • (?<=:)대장 뒤쪽을 봅니다(:)

놀랍게도 매우 "기본 R" 솔루션은 아직 추가되지 않았습니다.

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

regmatches(string, regexpr('E[0-9]+', string))

언급URL : https://stackoverflow.com/questions/17215789/extract-a-substring-according-to-a-pattern

반응형