2014-11-23 7 views
1

Регулярное выражение для разделенных запятой подстроки ПерестановкиРегулярное выражение для разделенных запятыми

Привет,

Я хотел бы определить регулярное выражение, которое соответствует последовательности, состоящие из двух суб-строк, разделенных одной запятая. Каждая подстрока может быть пустой и состоит исключительно и без повторения символов «A», «G», «C» и «T». Таким образом, шаблон должен соответствовать такие строки, как:

A, G
AG, CT
TC, CA < - правильно, 1 и 2 подстроки могут иметь символы в общей (до тех пор, как они не повторяется в подстроке).
GAT, CGA
CGAT, TG < - правильные подстроки могут иметь разную длину.
и т.д ...

и не должны совпадать:

, G < - отсутствует первый подстроки
ACGT < - недостающую запятую
X, A < - неправильный символ X
А.А., G < - повторение символа A в 1-й подстроке
AC, GGC < - повторение символа G во второй подстроке
ATGA, TGG- повторение в обоих подстроки
ATCXG, AAC < - неправильный символ X и повторение в 2 подстроки
и т.д ...

До сих пор у меня есть:

/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\1.*,)(?!,.*(.).*\1).*$/ 

/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\g{1}.*,)(?!,.*(.).*\g{1}).*$/ 

также пытался присоединение группы захвата с

/^(?=[ACGT]{1,4},[ACGT]{1,4}$)(?!.*(.).*\g{1}.*,.*(.).*\g{2}).*$/ 

Теперь, (?=[ACGT]{1,4},[ACGT]{1,4}$), похоже, соответствует «две подстроки, разделенные одной запятой "и" состоит исключительно из символов «A», «G», «C» и «T» через строку; (?!.*(.).*\1.*,), похоже, соответствует «без повторения» до запятой.

Однако (?!,.*(.).*\1) похоже, что он не соответствует повторному символу после запятой.

Я очень благодарен за ответы с подсказками и/или шаблонами, которые помогут с желаемым соответствием.

Использование Perl v5.18.2

Спасибо заранее

Роберт

+0

Это дало мне что-то интересное, чтобы попытаться использовать названные группы захвата. Спасибо, Роберт! Я надеюсь, что один из наших ответов хорошо подходит для вашей настройки :) StackOverflow - отличное место, чтобы получить помощь и рекомендации Regex! Могу ли я спросить, какие функции необходимы для этого? Мне интересно, в каком контексте можно использовать это распознавание образов. –

ответ

4

Разбейте вашу проблему на шаги.

Первый взгляд на разрешенный формат и символы. Затем проверьте, нет ли повтора.

use strict; 
use warnings; 

while (<DATA>) { 
    print if /^[ACGT]+,[ACGT]+$/ && !/(\w)\w*\1/; 
} 

__DATA__ 
A,G 
AG,CT 
TC,CA 
GAT,CGA 
CGAT,TG 
,G 
ACGT 
X,A 
AA,G 
AC,GGC 
ATGA,TGG 
ATCXG,AAC 

Выходы:

A,G 
AG,CT 
TC,CA 
GAT,CGA 
CGAT,TG 
+2

Очень аккуратный. Но я сочувствую движку регулярных выражений! – Borodin

+0

@ Бородин, спасибо за вдохновение. ** злой смех ** –

0

Я думаю, что вы очень близки. Это должно сработать.
Это в основном делает то, что делает @ Миллер.

обновленный - сокращенная версия.

# /(?m)^(?:(?:^|,)(?:([AGCT])(?![AGCT]*\1)){1,4}){2}$/ 

(?m)     # Multiline mode 
^      # BOL 
(?:     # Total cluster 
     (?:^| ,)   # BOL or comma 
     (?:     # AGCT Cluster grp 
      ([AGCT])    # (1), Capture single character [AGCT] 
      (?!     # Negative lookahead 
       [AGCT]*    # As many [AGCT] needed 
       \1      # to find what is captured in group 1 
      )      # End Negative lookahead 
    ){1,4}     # End AGCT Cluster grp 1-4 characters 
){2}     # Total cluster, do 2 times 
$      # EOL 
Смежные вопросы