2014-05-13 167 views
0

我想從python中的字符串中提取某些值。從字符串中提取值

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 SEVERE_IMPACT 
snp_1_881627 ENSG00000188976 NOC2L  16/19  SYNONYMOUS_CODON 

如果字符串值,爲每個現有然後輸出變量(GENE_ID,GENE_NAME,EXON_NUMBER)的,否則爲 「NA」(變量不存在,或者它們的值不存在)。在某些情況下,這些變量不存在於字符串中。

我應該使用哪種字符串方法做到這一點?我應該提取任何值之前拆我的字符串?我有10K行提取值爲每個snp_ *

string=string.split(';') 

附:我是python的新手

+1

你真的*嘗試*使用'split'嗎?代碼在哪裏,結果如何? – jonrsharpe

+0

一旦我拆分,要提取的值可能不一致,所以我不能通過索引使用它們。我想要在整個完整字符串中查找模式(例如GENE_ID)。 – Rgeek

+0

不要使用索引,實際上使用'startswith'在列表中搜索所需的條目。我建議你製作一本字典,例如'{'ID':'snp_1_881627','SEVERE_IMPACT':'SYNONYMOUS_CODON',...}' – jonrsharpe

回答

2

有兩種一般策略 - split和正則表達式。

要使用split,先分出行標籤(snp_1_881627):

rowname, data = row.split() 

然後,您可以使用;分離分裂data到各個條目:

data = data.split(';') 

由於需要爲了得到某些鍵的價值,我們可以把它變成字典:

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' 

在這裏我用一個「向後」相匹配的關鍵字之一,然後抓住從價值匹配使用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)