2015-10-07 5 views
1

Я плохо разбираюсь в регулярных выражениях и смотрел на некоторые онлайн-ресурсы для того, что я хотел бы сделать. Так в основном, у меня есть регулярное выражение в Python следующим образом:Получите полную подстроку, соответствующую шаблону регулярных выражений

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

Это должно найти все строки, к югу, которые начинаются с ATG и заканчиваются в TAG или TGA или ТАА. Я использую его как:

str = "ATGCCCTAG" 
print pattern.findall(str) 

Однако это возвращает ATGCCC и удаляет концевая TAG, и я хотел бы, чтобы держать задний TAG. Как я могу изменить его, чтобы дать мне полную подстроку?

+0

Я думаю, вы действительно ищете ['^ ATG (?: ...) *? (?: TAG | TGA | TAA) $'] (https://regex101.com/r/wI7hT9/2). –

+0

Нет, он не должен начинаться с ATG. Может быть подстрокой. – Luca

ответ

2

Вы можете использовать более простое регулярное выражение без опережающего просмотра , т.е.:

re.compile("ATG(?:...).*?(?:TAG|TGA|TAA)") 

DEMO:

https://regex101.com/r/qI4fV0/3


ОБЪЯСНЕНИЕ:

ATG(?:...).*?(?:TAG|TGA|TAA) 

ATG matches the characters ATG literally (case sensitive) 
(?:...) Non-capturing group 
    . matches any character (except newline) 
    . matches any character (except newline) 
    . matches any character (except newline) 
.*? matches any character (except newline) 
    Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy] 
(?:TAG|TGA|TAA) Non-capturing group 
    1st Alternative: TAG 
     TAG matches the characters TAG literally (case sensitive) 
    2nd Alternative: TGA 
     TGA matches the characters TGA literally (case sensitive) 
    3rd Alternative: TAA 
     TAA matches the characters TAA literally (case sensitive) 
+0

Спасибо. Не знал о взгляде .... – Luca

+0

Добро пожаловать, рад, что это сработало. –

2

Вы, кажется, не очень хорошо понимаете, что такое взгляд. Взглядом является нулевая ширина утверждение и средства «текущая позиция в строке сопровождается« », другими словами, она ничего не соответствует, поскольку это всего лишь тест. Следствие, контент, проверенный во втором представлении, не будет частью группы захвата 1, даже если вы поместите его внутрь. Обратите внимание: re.findall возвращает непустой результат только потому, что он возвращает содержимое групп захватов.

Если вы хотите, чтобы включить его в группе захвата 1, удалите второй предпросмотр и положить конец в группе захвата:

(?=(ATG(?:...)*?(?:TAG|TGA|TAA))) 

Интереса положить всю картину в опережающем просмотре и захват группа состоит в том, чтобы получить перекрывающиеся результаты. Например, ATGCCCATGCCCTAG вернет ATGCCCATGCCCTAG и ATGCCCTAG.

Если вы удалите его, вы будете получать только ATGCCCATGCCCTAG

3

Чтобы найти все строки, к югу, которые начинаются с ATG и заканчиваются в TAG или TGA или ТАА

Вам нужно будет в

ATG(?:...)*?(?:TAG|TGA|TAA) 

Это регулярное выражение также гарантирует, что существует 0 или более последовательностей с 3 символами (кроме новой строки) между ATG и последним TAG, TGA или TAA.

См regex demo

Python demo:

import re 
p = re.compile(r'ATG(?:...)*?(?:TAG|TGA|TAA)') 
test_str = "FFG FFG ATGCCCTAG" 
print (p.findall(test_str)) 

Это будет работать, если вам нужно найти Неперекрывающиеся подстроки. Чтобы найти перекрывающиеся те, техник для инкапсуляции, что в группу захвата и место в не-якоре положительного предпросмотра:

r'(?=(ATG(?:...)*?(?:TAG|TGA|TAA)))' 
    | |       || 
    | | --- Capture group ------- || 
    | -- Positive look-ahead ------ | 

См regex demo

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