2014-05-13 124 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)