正则表达式Python Variab

2024-06-20 14:56:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的数据:

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

我想做的是如果我有号码>;Px016979或我可以得到下面的数据就像是这个:

^{pr2}$

我是Python新手。在

^{3}$

我的代码不能工作。我有两个问题:

  1. 我想我的数据有回车,所以我的代码不能工作。

  2. 我不知道如何在Python正则表达式中使用变量。如果我写re.match( r'>Px016797(.*?)>',a,re.M|re.I)它可以工作,但我需要使用变量。

谢谢。在


Tags: 数据代码remlspsvaikvqvlyigkvrisqrkvpdtliddalvkfvhheaekvkanmlpx016980nvfvsynfesnystlnniteidevlfpnlpvvtarhsrsitrelaytvletkfkehglggrecllrniceaaetplhhngllghimhivftpsssaeegldafgnskedsgdyrkspapeddmvgagayqrpsvtesenmlprhlspeva
3条回答

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

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

这将显示以下内容:

^{pr2}$

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

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.

使用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

我也会考虑安装biopython并查看免费在线的《python for biologics》(http://pythonforbiologists.com/)一书。我与fastas一起工作过很多次,对于一个快速而肮脏的解决方案,您可以使用以下方法(将其余代码保持原样):

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

for item in matchbj:
   print item 

因为雷多尔标记,并查找“>;”字符之间的任意数量的任何内容。 请注意,这会给你一个列表,而不是一个对象。根据我的经验,重新匹配人们学习的第一件事是,他们往往在寻找关于芬德尔. 在

相关问题 更多 >