Проблемы с получением нужных строк с помощью регулярных выражений - PullRequest
1 голос
/ 11 октября 2019

Я новичок в функции выражения регулярных выражений с Python. У меня есть файл, где мне нужно отфильтровать аминокислотную последовательность. Вот быстрый просмотр файла:

> nxp: NX_A0A0A6YYD4-1 \ PName = бета-переменная рецептора Т-клетки 13 изоформа Iso 1 \ GName = TRBV13 \ NcbiTaxId = 9606 \ TaxName = Homo Sapiens \Длина = 124 \ SV = 5 \ EV = 31 \ PE = 3 \ ModResPsi = (52 | MOD: 00798 | половина цистина) (120 | MOD: 00798 | половина цистина) \ ModRes = (106 || N-связанный (GlcNAc...) аспарагин) \ VariantSimple = (18 | Н) (27 | V) \ Обработанные = (1 | 31 | Peff: 0001021 | сигнальный пептид) (32 | 124 | Peff: 0001020 | зрелого белка) MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL

> nxp: NX_A0A1B0GV90-1 \ PName = Кортексиновый домен, содержащий 2 изоформы 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) \ Обработано = (1 | 55 | PEFF: 0001020 | зрелый белок) MEDSSLSSGVDVDKGFAIAFVVLLFLFLIVMIFRCAKLVKNPYKASSTTTEPSLS * 100 * * 6 *

Я мог бы отфильтровать конечную точку необходимой точки и начальную точку. Как вы можете видеть в моем коде, начало должно быть после координат после \ 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)

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

\\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

0 голосов
/ 11 октября 2019

Как правило, есть 3 способа анализа данных:

  • Использование str методов.
  • Использование регулярных выражений, например, с re.
  • Используйте синтаксический анализатор, например parsimonious

Вот действительно фантастический ответ на вопрос об использовании регулярных выражений ипарсеры.

Они все нервные. Но строковые методы легко отлаживать, а регулярные выражения и парсеры - нет. Итак, мой первый шаг - попытаться распаковать данные строковыми методами, например, вот так:

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'}}

И это легче

Теперь мы можем перейти к этой последовательности символов, и, возможно, это не так уж сложно, и мы можем подумать об использовании регулярных выражений без головной боли, например:

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

Это дает:

'MLSPDLPDSAWNTRLLCRVMLCLLGAGSVAAGVIQSPRHLIKEKRETATLKCYPIPRHDT VYWYQQGPGQDPQFLISFYEKMQSDKGSIPDRFSAQQFSDYHSELNMSSLELGDSALYFC ASSL'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...