正则表达式Python变量

时间:2015-09-24 12:44:20

标签: python regex bioinformatics

我有这样的数据:

>Px016979
MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT
DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA
AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF
GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS

我想要做的是,如果我有数字> Px016979,或者我可以得到它下面的数据。就像这样:

#coding:utf-8
import os,re


a =   """ 
    >Px016979 
    MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT 
    DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA 
    AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF 
    GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS 
    >Px016980 
    MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK 
    NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE 
    TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL 
    DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT"
    >Px002185
    MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
    RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
    LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
    GLVLPVKKVT
    >Px006321
    MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
    PMSLITKFLVNSYY

    """

  b = '>Px016979'


  matchbj = re.match( r'$b(.*?)>',a,re.M|re.I)

  print matchbj.group()

我是Python新手。

re.match( r'>Px016797(.*?)>',a,re.M|re.I)

我的代码无法正常工作。我有两个问题:

  1. 我认为我的数据有回车条,所以我的代码无法正常工作。

  2. 我不知道如何在Python正则表达式中使用变量。如果我写cached_db它可以工作,但我需要使用变量。

  3. 感谢。

3 个答案:

答案 0 :(得分:5)

看起来您的数据是带有蛋白质序列的FASTA文件。因此,您应该考虑安装BioPython而不是使用正则表达式。这是一个专门用于生物信息学使用和研究的图书馆。

  

Biopython的目标是通过创建高质量,可重复使用的模块和类,使Python尽可能容易地用于生物信息学。 Biopython功能包括各种生物信息学文件格式(BLAST,Clustalw,FASTA,Genbank等)的解析器,访问在线服务(NCBI,Expasy,...),与常见和不常见程序的接口(Clustalw, DSSP,MSMS ...),标准序列类,各种聚类模块,KD树数据结构等甚至文档。

使用BioPython,您可以通过以下方式从FASTA文件中提取给定标识符的序列:

from Bio import SeqIO

input_file = r'C:\path\to\proteins.fasta'
record_id = 'Px016979'
record_dict = SeqIO.to_dict(SeqIO.parse(input_file, 'fasta'))
record =  record_dict[record_id]
sequence = str(record.seq)

print sequence

答案 1 :(得分:0)

以下内容适用于您拥有的每个条目:

a = """ 
    >Px016979 
    MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT 
    DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA 
    AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF 
    GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS 
    >Px016980 
    MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK 
    NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE 
    TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL 
    DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT"
    >Px002185
    MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
    RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
    LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
    GLVLPVKKVT
    >Px006321
    MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
    PMSLITKFLVNSYY

    """

for b in ['>Px016979', '>Px016980', '>Px002185', '>Px006321']:
    re_search = re.search(re.escape(b) + r'(.*?)(?:>|\Z)', a, re.M|re.I|re.S)
    print re_search.group()

这将显示以下内容:

>Px016979 
    MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT 
    DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA 
    AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF 
    GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS 
    >
>Px016980 
    MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK 
    NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE 
    TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL 
    DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT"
    >
>Px002185
    MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
    RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
    LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
    GLVLPVKKVT
    >
>Px006321
    MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
    PMSLITKFLVNSYY

答案 2 :(得分:0)

我还会考虑安装biopython并查看免费在线(http://pythonforbiologists.com/)生物学家的书籍python。我使用fastas进行了很多工作,对于快速而肮脏的解决方案,您可以使用它(保留其余代码):

matchbj = re.findall( '>.*', a, re.DOTALL)

for item in matchbj:
   print item 

由于re.DOTALL标志,它基本匹配线条,并查找'>'之间的任何数量的任何内容。字符。 请注意,这将在列表中给予他们,而不是对象。根据我的经验,重新匹配人们学习的第一件事,但他们经常在寻找re.findall的效果。