2017-12-20 18 views
-1

내가 같은 문자열이를 형성 좌표추출은 UCSC 이름

hg38_ct_tbrefGene_6787_NM_000029_1_range = chr1 : 230709995-230710853_5'pad = 0_3'pad = 0_strand = -_ repeatMasking = 없음 내가 좌표를 추출하고 싶습니다

, 위 예제에서 : 230709995와 230710853. 나는 문자열의 이전 부분이 항상 같은 길이가 아니라는 것을 언급해야한다. 나는 gsub이 최선의 선택이지만 너무 많은 "_"을 얻을 수 없다고 생각합니다.

또한 이러한 종류의 문제에 대한 패턴 매칭 cheatsheet/book/blog의 제안이 좋습니다! 감사합니다.

답변

2

이 목적으로 정규 표현식과 캡처 링 그룹을 사용할 수 있습니다. 자세한 정보는 웹에서 "regex"또는 "regular expression"을 검색하면 유연한 검색 및 추출 패턴을 설정하는 방법을 안내 할 여러 사이트가 있습니다. 아래의 문자열 추출을 위해 다음과 같이 작동합니다 (좌표는 항상 범위으로 시작한다고 가정합니다). gsub의 대안으로 stringi 패키지의 stri_extract 등을 사용할 수도 있습니다.

그룹에게 (괄호 안에 내용) 캡처

검색 : 모든 문자 뒤에 문자열의
(^.*) 시작 0 번 이상 콜론 다음에 어떤 문자 뒤에 0 번 이상
(range.*:)범위를 :
(\\d+)
하나 이상의 숫자
(\\D) 이상의 비 문자 숫자
(\\d+) 하나 이상의 숫자
(.*$) 모든 문자를 0 회 이상 문자열의 끝에까지

추출물 :
\\3 캡처 즉 제 3 그룹, 즉 제 (\\d+)
\\5 캡처 기 (5), 제 (\\d+)

string <- "hg38_ct_tbrefGene_6787_NM_000029_1_range=chr1:230709995-230710853_5'pad=0_3'pad=0_strand=-_repeatMasking=none" 

strsplit(gsub("(^.*)(range.*:)(\\d+)(\\D)(\\d+)(.*$)", "\\3 \\5", string , perl = TRUE), " ") 
# [[1]] 
# [1] "230709995" "230710853"