使用regex获取所需行的问题

2024-05-04 10:23:03 发布

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

我是python正则表达式函数的新手。我有个文件需要过滤氨基酸序列。以下是对该文件的快速查看:

>nxp:NX_A0A0A6YYD4-1 \PName=T cell receptor beta variable 13 isoform Iso 1 \GName=TRBV13 \NcbiTaxId=9606 \TaxName=Homo Sapiens \Length=124 \SV=5 \EV=31 \PE=3 \ModResPsi=(52|MOD:00798|half cystine)(120|MOD:00798|half cystine) \ModRes=(106||N-linked (GlcNAc...) asparagine) \VariantSimple=(18|H)(27|V) \Processed=(1|31|PEFF:0001021|signal peptide)(32|124|PEFF:0001020|mature protein) MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL

>nxp:NX_A0A1B0GV90-1 \PName=Cortexin domain containing 2 isoform Iso 1 \GName=CTXND2 \NcbiTaxId=9606 \TaxName=Homo Sapiens \Length=55 \SV=1 \EV=11 \PE=3 \VariantSimple=(13|N)(22|F)(29|T)(34|Q)(45|T) \Processed=(1|55|PEFF:0001020|mature protein) MEDSSLSSGVDVDKGFAIAFVVLLFLFLIVMIFRCAKLVKNPYKASSTTTEPSLS

我可以过滤出所需点的端点和起点。正如您在我的代码中所看到的,开始在\VarableSimple后面的坐标之后,结束应该是下一个“>;”字符。现在我找不到过滤掉MLSPDLPD的方法。。。。。顺序。有人能给我个主意吗?你知道吗

with open('PATH/XYZ', 'r') as f:
    data = f.read()

import regex

h = regex.compile("(.*)\n").match(data)
header = h.group(1)
start = regex.match(".+\\\VariantSimple=(\([^)]+\))*\s{0,1}", data)
start.captures(1)
end = regex.compile("(.)*\>").match(data)
end.captures(0)

Tags: 文件datamatchisoregexnxhomonxp
2条回答

\\VariantSimple=((?:\([^\)]+\))*) \\Processed=((?:\([^\)]+\))*) ([\s\S]*?)(?:\n*>|$)

这个正则表达式将捕获你的氨基酸序列。在结束“已处理”数据字段之后,它捕获跨行的所有字符,直到它到达紧跟>字符的换行符,或者一行的结尾。这应该适合您的python代码。你知道吗

Regex demo

一个示例代码看起来像这样;它将匹配尽可能多的氨基酸字符串,然后将它们打印出来。你知道吗

import re

with open('data.txt', 'r') as fil:
  data = fil.read()


rex = re.compile("\\\VariantSimple=(?:\([^\)]+\))* \\\Processed=(?:\([^\)]+\))* ([\s\S]*?)(?:\n*>|$)")
rex2 = re.compile("Variant")

out = re.findall(rex, data)

for mtch in out:
  print(mtch + "\n")

输出:

MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL

MEDSSLSSGVDVDKGFAIAFVVLLFLFLIVMIFRCAKLVKNPYKASSTTTEPSLS

Python demo

一般来说,有3种方法可以像这样解析数据:

  • 使用^{}方法。你知道吗
  • 使用regex,例如与^{}一起使用。你知道吗
  • 使用解析器,例如^{}

Here's a really fantastic answer on SO about using regex and parsers.

他们都很烦躁。但是字符串方法很容易调试,正则表达式和解析器。。。不是。所以我的第一步是尝试用字符串方法解包数据,可能是这样的:

d = data.split('\\')

nxp, items, this_item = None, {}, {}

for item in d:

    if 'nxp' in item:
        if nxp:
            items[nxp] = this_item
            this_item = {}
        nxp = item.strip().split(':')[-1]
        continue

    if '=' in item:
        key, value = item.strip().split('=')
        this_item[key] = value

else:
    items[nxp] = this_item

这将产生一个数据字典:

{'NX_A0A0A6YYD4-1': {'PName': 'T cell receptor beta variable 13 isoform Iso 1',
  'GName': 'TRBV13',
  'NcbiTaxId': '9606',
  'TaxName': 'Homo Sapiens',
  'Length': '124',
  'SV': '5',
  'EV': '31',
  'PE': '3',
  'ModResPsi': '(52|MOD:00798|half cystine)(120|MOD:00798|half cystine)',
  'ModRes': '(106||N-linked (GlcNAc...) asparagine)',
  'VariantSimple': '(18|H)(27|V)',
  'Processed': '(1|31|PEFF:0001021|signal peptide)(32|124|PEFF:0001020|mature protein) MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL'},
 'NX_A0A1B0GV90-1': {'PName': 'Cortexin domain containing 2 isoform Iso 1',
  'GName': 'CTXND2',
  'NcbiTaxId': '9606',
  'TaxName': 'Homo Sapiens',
  'Length': '55',
  'SV': '1',
  'EV': '11',
  'PE': '3',
  'VariantSimple': '(13|N)(22|F)(29|T)(34|Q)(45|T)',
  'Processed': '(1|55|PEFF:0001020|mature protein) MEDSSLSSGVDVDKGFAIAFVVLLFLFLIVMIFRCAKLVKNPYKASSTTTEPSLS'}}

这感觉更容易挥舞。你知道吗

现在我们可以继续寻找这个字符序列,也许这并不难,我们可以考虑使用regex而不必头痛,例如:

import re
re.search(r'\) ([ A-Z]+)', items['NX_A0A0A6YYD4-1']['Processed']).groups()[0]

这将提供:

'MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL'

相关问题 更多 >