2014-05-13 5 views
0

파이썬의 문자열에서 특정 값을 추출하고 싶습니다.문자열에서 값을 추출하십시오.

snp_1_881627 AA=G;ALLELE=A;DAF_GLOBAL=0.473901;GENE_TRCOUNT_AFFECTED=1;GENE_TRCOUNT_TOTAL=1;SEVERE_GENE=ENSG00000188976;SEVERE_IMPACT=SYNONYMOUS_CODON;TR_AFFECTED=FULL;ANNOTATION_CLASS=REG_FEATURE,SYNONYMOUS_CODON,ACTIVE_CHROM,NC_TRANSCRIPT_VARIANT,NC_TRANSCRIPT_VARIANT;A_A_CHANGE=.,L,.,.,.;A_A_LENGTH=.,750,.,.,.;A_A_POS=.,615,.,.,.;CELL=GM12878,.,GM12878,.,.;CHROM_STATE=.,.,11,.,.;EXON_NUMBER=.,16/19,.,.,.;GENE_ID=.,ENSG00000188976,.,ENSG00000188976,ENSG00000188976;GENE_NAME=.,NOC2L,.,NOC2L,NOC2L;HGVS=.,c.1843N>T,.,n.3290N>T,n.699N>T;REG_ANNOTATION=H3K36me3,.,.,.,.;TR_BIOTYPE=.,PROTEIN_CODING,.,PROCESSED_TRANSCRIPT,PROCESSED_TRANSCRIPT;TR_ID=.,ENST00000327044,.,ENST00000477976,ENST00000483767;TR_LENGTH=.,2790,.,4201,1611;TR_POS=.,1893,.,3290,699;TR_STRAND=.,-1,.,-1,-1 

출력 :

문자열 다음 출력을 기존 해당 변수 (GENE_ID, GENE_NAME, EXON_NUMBER)의 각각의 값을 갖는 경우
   GENE_ID   GENE_NAME EXON_NUMBER SEVERE_IMPACT 
snp_1_881627 ENSG00000188976 NOC2L  16/19  SYNONYMOUS_CODON 

, 다른 "NA"는 (변수가 존재하지 않거나 그 값 존재하지 않습니다.) 경우에 따라 이러한 변수는 문자열에 존재하지 않습니다. 내가 어떤 값을 추출하기 전에 내 문자열을 분리 해야하는 나는 이러한 목표를 달성하는 데 사용해야하는 문자열 방법

? 나는 각 snp_ *

string=string.split(';') 

P.S.에 대한 값을 추출하는 10,000 행이 나는 파이썬으로 초보자이다

+1

실제로 '분할'을 사용하려고 했습니까? 코드는 어디에 있고 그 결과는 무엇입니까? – jonrsharpe

+0

일단 분할하면 추출 할 값이 일치하지 않아 인덱스를 통해 값을 사용할 수 없습니다. 전체 문자열에서 패턴 (예 : GENE_ID)을 찾으려고했습니다. – Rgeek

+0

인덱스를 사용하지 말고 실제로 'startswith'를 사용하여 목록에서 원하는 용어를 검색하십시오. 예를 들어 사전을 만드는 것이 좋습니다. '{ 'ID': 'snp_1_881627', 'SEVERE_IMPACT': 'SYNONYMOUS_CODON', ...}' – jonrsharpe

답변

2

split과 정규식에 대한 두 가지 일반적인 전략이있다.

data = data.split(';') 

당신이 필요로하기 때문에 : 당신이 ; 구분 기호를 사용하여 개별 항목에 data을 분할 할 수 있습니다, 그리고

rowname, data = row.split() 

: split를 사용하려면

먼저 행 라벨 (snp_1_881627)를 물적 분할 특정 키의 값을 얻기 위해 사전으로 바꿀 수 있습니다 :

dataDictionary = {} 
for entry in data: 
    entry = entry.split('=') 
    dataDictionary[entry[0]] = entry[1] if len(entry) > 1 else None 

그러면 키가 dataDictionary에 있는지 간단히 확인할 수 있습니다. 그렇다면 값을 가져옵니다.

split을 사용하면 데이터 문자열의 모든 항목을 색인화하여 필요한 항목을 쉽게 찾을 수 있다는 점에서 유용합니다. 여기

>>> import re 
>>> re.search('(?<=GENE_ID=)[^;]*', 'onevalue;GENE_ID=SOMETHING;othervalue').group() 
'SOMETHING' 

나는 다음의 값을 잡아, 키워드 중 하나와 일치하는 "lookbehind"을 사용하고 있습니다 :

하면 변경되지 않습니다 필요로하는 사람은, 다음 정규식 더 나은 옵션이 될 수있는 경우 일치는 group()입니다. 키워드를 목록에 넣으면 다음과 같은 모든 값을 찾을 수 있습니다.

import re 
... 
keywords = ['GENE_ID', 'GENE_NAME', 'EXON_NUMBER', 'SEVERE_IMPACT'] 
desiredValues = {} 
for keyword in keywords: 
    match = re.search('(?<={}=)[^;]*'.format(keyword), string_to_search) 
    desiredValues[keyword] = match.group() if match else DEFAULT_VALUE 
0

나는 이것이 당신이 찾고있는 해결책이 될 것이라고 생각합니다.

#input 
user_in = 'snp_1_881627 AA=G;ALLELE=A;DAF_GLOBAL=0.473901;GENE_TRCOUNT_AFFECTED=1;GENE_TRCOUNT_TOTAL=1;SEVERE_GENE=ENSG00000188976;SEVERE_IMPACT=SYNONYMOUS_CODON;TR_AFFECTED=FULL;ANNOTATION_CLASS=REG_FEATURE,SYNONYMOUS_CODON,ACTIVE_CHROM,NC_TRANSCRIPT_VARIANT,NC_TRANSCRIPT_VARIANT;A_A_CHANGE=.,L,.,.,.;A_A_LENGTH=.,750,.,.,.;A_A_POS=.,615,.,.,.;CELL=GM12878,.,GM12878,.,.;CHROM_STATE=.,.,11,.,.;EXON_NUMBER=.,16/19,.,.,.;GENE_ID=.,ENSG00000188976,.,ENSG00000188976,ENSG00000188976;GENE_NAME=.,NOC2L,.,NOC2L,NOC2L;HGVS=.,c.1843N>T,.,n.3290N>T,n.699N>T;REG_ANNOTATION=H3K36me3,.,.,.,.;TR_BIOTYPE=.,PROTEIN_CODING,.,PROCESSED_TRANSCRIPT,PROCESSED_TRANSCRIPT;TR_ID=.,ENST00000327044,.,ENST00000477976,ENST00000483767;TR_LENGTH=.,2790,.,4201,1611;TR_POS=.,1893,.,3290,699;TR_STRAND=.,-1,.,-1,-1' 

#set some empty vars 
user_in = user_in.split(';') 
final_output = "" 
GENE_ID_FOUND = False 
GENE_NAME_FOUND = False 
EXON_NUMBER_FOUND = False 
GENE_ID_OUTPUT = '' 
GENE_NAME_OUTPUT = '' 
EXON_NUMBER_OUTPUT = '' 
SEVERE_IMPACT_OUTPUT = '' 


for x in range(0, len(user_in)): 
    if x == 0: 
    first_line_count = 0 
    first_line_print = '' 
    while(user_in[0][first_line_count] != " "): 
     first_line_print += user_in[0][first_line_count] 
     first_line_count += 1 
    final_output += first_line_print + "\t" 
    else: 

    if user_in[x][0:11] == "SEVERE_GENE": 
     GENE_ID_OUTPUT += user_in[x][12:] + "\t" 
     GENE_ID_FOUND = True 

    if user_in[x][0:9] == "GENE_NAME": 
     GENE_NAME_OUTPUT += user_in[x][10:] + "\t" 
     GENE_NAME_FOUND = True 

    if user_in[x][0:11] == "EXON_NUMBER": 
     EXON_NUMBER_OUTPUT += user_in[x][12:] + "\t" 
     EXON_NUMBER_FOUND = True 

    if user_in[x][0:13] == "SEVERE_IMPACT": 
     SEVERE_IMPACT_OUTPUT += user_in[x][14:] + "\t" 

if GENE_ID_FOUND == True: 
    final_output += GENE_ID_OUTPUT 
else: 
    final_output += "NA" 

if GENE_NAME_FOUND == True: 
    final_output += GENE_NAME_OUTPUT 
else: 
    final_output += "NA" 

if EXON_NUMBER_FOUND == True: 
    final_output += EXON_NUMBER_OUTPUT 
else: 
    final_output += "NA" 

final_output += SEVERE_IMPACT_OUTPUT 


print(final_output) 
관련 문제