0

I have data like this:

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

What I want to do is if I have the number >Px016979 or I can get the data bellow it.like this:

>Px016979
MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT
DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA
AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF
GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS

I am new with Python.

#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()

My code can not work. I have two questions:

  1. I think my data has carriage return so my code can't work.

  2. I don't know how to use variables in Python regular expression. If I write re.match( r'>Px016797(.*?)>',a,re.M|re.I) it can work, but I need to use variables.

Thanks.

Martin Evans
  • 45,791
  • 17
  • 81
  • 97
R.hui
  • 523
  • 1
  • 4
  • 8
  • 2
    Is a regex the right tool for this? If you are fetching this data from a file in the first instance, I'd consider each line in turn If it starts with > then that line defines a key. If it doesn't, that line is data and I'd append it to the value of `d[key]` (initialize `d={}` at start, `d[key]=""` for every new key). Once you've built the dict, you can simply refer to the data you seek as `d[key]`, or check whether it exists at all with `if key in d:`. – nigel222 Sep 24 '15 at 13:48

3 Answers3

5

It looks like your data is a FASTA file with protein sequences. So instead of using regular expressions, you should consider installing BioPython. That is a library specifically for bioinformatics use and research.

The goal of Biopython is to make it as easy as possible to use Python for bioinformatics by creating high-quality, reusable modules and classes. Biopython features include parsers for various Bioinformatics file formats (BLAST, Clustalw, FASTA, Genbank,...), access to online services (NCBI, Expasy,...), interfaces to common and not-so-common programs (Clustalw, DSSP, MSMS...), a standard sequence class, various clustering modules, a KD tree data structure etc. and even documentation.

Using BioPython, you would extract a sequence from a FASTA file for a given identifier in the following way:

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
BioGeek
  • 21,897
  • 23
  • 83
  • 145
0

The following should work for each of the entries you have:

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()

This will display the following:

>Px016979 
    MSPWMKKVFLQCMPKLLMMRRTKYSLPDYDDTFVSNGYTNELEMSRDSLT 
    DAFGNSKEDSGDYRKSPAPEDDMVGAGAYQRPSVTESENMLPRHLSPEVA 
    AALQSVRFIAQHIKDADKDNEVVEDWKFMSMVLDRFFLWLFTIACFVGTF 
    GIIFQSPSLYDTRVPVDQQISSIPMRKNNFFYPKDIETIGIIS 
    >
>Px016980 
    MQFIKKVLLIALTLSGAMGISREKRGLIFPPTSLYGTFLAIAVPIDIPDK 
    NVFVSYNFESNYSTLNNITEIDEVLFPNLPVVTARHSRSITRELAYTVLE 
    TKFKEHGLGGRECLLRNICEAAETPLHHNGLLGHIMHIVFTPSSSAEEGL 
    DDEYYEAEASGRAGSCARYEELCPVGLFDLITRIVEFKHT"
    >
>Px002185
    MLSPSVAIKVQVLYIGKVRISQRKVPDTLIDDALVKFVHHEAEKVKANML
    RRHSLLSSTGTSIYSSESAENLNEDKTKTDTSEHNIFLMMLLRAHCEAKQ
    LRHVHDTAENRTEFLNQYLGGSTIFMKAKRSLSSGFDQLLKRKSSRDEGS
    GLVLPVKKVT
    >
>Px006321
    MFPGRTIGIMITASHNLEPDNGVKLVDPDGEMLDGSWEEIATRMANVRYL
    PMSLITKFLVNSYY
Martin Evans
  • 45,791
  • 17
  • 81
  • 97
0

I would also consider installing biopython and checking out the book python for biologists which is free online (http://pythonforbiologists.com/). I worked with fastas a lot and for a quick and dirty solution you can just use this (leave the rest of the code as is):

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

for item in matchbj:
   print item 

It basically matches over lines because of the re.DOTALL flag, and looks for any number of any things between '>' characters. Be advised, this will give them to you in list for, not an object. In my experience, re.match in the first thing people learn but they are often looking for the effect of re.findall.