2016-09-18 3 views
-2

У меня есть строка без пробела.Регулярное выражение для извлечения строки между двумя словами

ATG AGC TAA CTC AGG TGA TGG GGA ATG CCC CGC TAA 

Мне нужно извлечь строку между ATG и заканчивая либо TAG|TGA|TAA (не должна включать в себя конец) . Как извлечь из строки, чтобы получить

ATGAGC и ATGCCCCGCTAA с использованием регулярных выражений.

, что я пытался

pattern = re.compile(r'(?=(ATG(?:...)*?)(?=TAG|TGA|TAA))') 

он не работает, как ожидалось.

+1

В каком результате вы получаете? – Soviut

+4

Я чувствую, что эти вопросы задают в это время каждый год .... Например [здесь] (http://stackoverflow.com/q/18731894/) и [здесь] (http://stackoverflow.com/ q/16260794 /) и [здесь] (http://stackoverflow.com/q/19761908/) и [здесь] (http://stackoverflow.com/q/31757876) и .... – Dan

+2

Почему 'ATGCCCCGCTAA' содержит «ТАА»? И 'ATGAGC' не делает? – Kasramvd

ответ

1

Используйте следующее регулярное выражение:

In [14]: regex = re.compile(r'(ATG.*?)(?:TAG|TGA|TAA)') 

In [15]: regex.findall(s) 
Out[15]: ['ATGAGC', 'ATGGGGAATGCCCCGC'] 

Обратите внимание, что эти матчи не содержат завершающие.

0
import re 

pattern = re.compile(r'(ATG[A-Z]+)(?:TAG|TGA|TAA)') 
results = pattern.search('ATGCCCCGCTAA') 

print results.groups(0) 

Результаты в

('ATGCCCCGC',) 
0

Это работает, учитывая, что концовки не включены:

>>> re.findall(r'(ATG(?:...)*?)(?:TAG|TGA|TAA)', seq) 
['ATGAGC', 'ATGCCCCGC'] 

?: означает, что образцы не будут захвачены в результате.

...: указывает ровно три символа. Альтернативными являются .{3} или более ограничительный случай [ACTG]{3}

*?: подразумевает минимальный совпадение. Без этого будет достигнуто самое длинное совпадение.

Смежные вопросы