2014-09-15 3 views
-3

У меня есть следующие строки аминокислот:все возможные пептиды из строки аминокислот

s = 'SHVANSGYMGMTPRLGLESLLE*A*MIRVAS' 

где * обозначает стоп-кодон.

Я хочу, чтобы извлечь все пептиды (цепочки аминокислот, т.е. подстроки), которые удовлетворяют следующие условия:

  1. Цепочка начинается с аминокислотой M
  2. цепь заканчивается *

Если я использую регулярное выражение M.*?\* в Python на этой конкретной строке, он возвращает один пептид:

MGMTPRLGLESLLE* 

Это верно только отчасти, потому что она игнорирует другое возможное решение:

MTPRLGLESLLE* 

Другими словами, мне нужно регулярное выражение, которое возвращает два пептиды:

MGMTPRLGLESLLE* 

и

MTPRLGLESLLE* 

Любые идеи?

ответ

0
(?=(M.*?\*)) 

Используйте это. Для проверки строк используется положительный результат. Поскольку это утверждение ширины 0, оно может соответствовать всем строкам.

Вы можете использовать его как:

print re.findall(r"(?=(M.*?\*))",x) 

Смотрите демо, http://regex101.com/r/jT3pG3/5.

0

Пакет 're', похоже, не поддерживает совпадающие совпадения (поэтому findall или finditer не найдете нужные вам два соответствия).

Однако есть новый пакет Python под названием regex, который, по-видимому, исправляет это: https://pypi.python.org/pypi/regex. Вы можете установить его с помощью одного из этих двух команд:

pip install regex 
easy_install regex 

Импорт пакета регулярных выражений вместо повторной, следующий скрипт делает то, что вы хотите:

#!/usr/bin/python 
import regex as re 
s = "SHVANSGYMGMTPRLGLESLLE*A*MIRVAS" 
matches = re.findall(r'M.*?\*', s, overlapped=True) 
for match in matches: print match 
Смежные вопросы