как мне объединить эти регулярные выражения? - PullRequest
5 голосов
/ 11 июля 2011
 $syb =~ s/(at{3,6})/\U$1/gi;

 $syb =~ s/(aat{2,5})/\U$1/gi;

 $syb =~ s/(aaat{1,4})/\U$1/gi;

 $syb =~ s/(aaaat{0,3})/\U$1/gi;

 $syb =~ s/(aaaaat{0,2})/\U$1/gi;

 $syb =~ s/(a{4,7})/\U$1/gi;

 $syb =~ s/(aaaaaat)/\U$1/gi;

 $syb =~ s/(t{4,7})/\U$1/gi;

Можно ли как-нибудь объединить все эти регулярные выражения в одно?Плохо ли использовать такое количество регулярных выражений в одной строке?конечный результат должен быть, если $ syb равно aaatcgacgatcgatcaatttcgaaaaaggattttttatgcacgcacggggattaaaa, регулярное выражение должно сделать его AAATcgacgatcgatcAATTTcgAAAAAggATTTTTTatgcacgcacggggattAAAA

. Одна проблема с моими регулярными выражениями состоит в том, что они соответствуют aaaatttt как два отдельных совпадения и выводят AAAATTTT.Мне также нужно это исправить.

У меня есть строка с буквами T и G, хранящимися в $ syb.я хочу использовать заглавные буквы в любой части строки, в которой есть набор символов «А», за которыми следуют буквы «Т», только буквы «А» или только буквы «Т» (буквы «А» не должны), а раздел с заглавными буквами может быть не короче 4 и не длиннее 7

Ответы [ 2 ]

5 голосов
/ 11 июля 2011

Это сложный вопрос.Я думаю, что это может сработать:

s/((?<!a)a|(?<!a|t)t)((?<!t)\1|t){3,6}(?!\2|t)/\U$&/gi

По сути, я делаю следующее:

  1. Получите a, которому не предшествует a.Или t, которому не предшествует a или t.
    • ((?<!a)a|(?<!a|t)t)
  2. Получить еще 3-6 первого матча или t's без предшествующего t
    • ((?<!t)\1|t){3,6}
  3. Убедитесь, что за ним не следует последний элемент последовательности или t.
    • (?!\2|t)/

И код perl:

$syb = "aaatcgacgatcgatcaatttcgaaaaaggattttttatgcacgcacggggattaaaaactgaaaattttactgaaaaaaaasttttttts";
$syb =~ s/((?<!a)a|(?<!a|t)t)((?<!t)\1|t){3,6}(?!\2|t)/\U$&/gi;
print $syb;

Редактировать принимаяочередь из qtax Я удалил группы захвата из своей группы и персонажей из его:

s/(?:(?<!a)a|(?<!a|t)t)(?:(?<!t)a|t){3,6}(?!(?<=a)a|t)/\U$&/gi

Редактировать: уменьшив регулярное выражение на 5 символов.комментарии

s/
# Look behind for a char not an 'a' nor a 't' followed by a 't'
(?<!a|t(?=t))
# Capture 3-6 'a's or 't's not followed by 'a's
(?:a|t(?!a)){3,6}
# Capture an 'a' not followed by an 'a', or a 't'
(?:a(?!a)|t)
#make sure none of this is followed by a 't'.
(?!t)
/\U$&/gix;
3 голосов
/ 11 июля 2011

Как указано в чате, если возможная комбинация длиннее 7, она должна игнорироваться, и никакие ее части не заменяются. Посмотреть этот чат .

Моя обратная ссылка бесплатное решение:

s/
(?:(?<!a)a|(?<!t|a)t)
(?:(?<=a)a|(?<=a)t|(?<=t)t){3,6}
(?!(?<=a)a|(?<=a)t|(?<=t)t)
/\U$&/gix;

С некоторыми комментариями:

s/
# match the first [at] only if not part of a valid sequence
(?:(?<!a)a|(?<!t|a)t)
# only match the allowed transitions: a->a, a->t, t->t
(?:(?<=a)a|(?<=a)t|(?<=t)t){3,6}
# ending can not be a valid transition: negate the above
(?!(?<=a)a|(?<=a)t|(?<=t)t)
/\U$&/gix;

Обновление: Применил идеи сокращения Джейкобом, здесь с некоторыми комментариями:

s/
# match the first a or t only if it's not part of a valid sequence
(?:(?<!a)a|(?<!t|a)t)
# only match the allowed transitions: a->a, a->t, t->t
# (t can follow any of the previous chars, so no need to check it)
(?:(?<=a)a|t){3,6}
# ending can not be a valid transition: negate the above
(?!(?<=a)a|t)
/\U$&/gix;

Редактировать : решение с меньшими регулярными выражениями, просто для удовольствия:

s/(a+t*|t+)/(length $1 >= 4 && length $1 <= 7)? "\U$1": $1/gie;

PS: Спасибо OP за более интересный, чем обычно, вопрос регулярных выражений. :)

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