Perl Regex находит и возвращает все возможные совпадения - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь создать цикл while, который найдет все возможные подстроки в строке. Но пока все, что я могу найти, это самый большой экземпляр или самый короткий. Так, например, у меня есть строка

РЕДАКТИРОВАТЬ СТРОКУ ИЗМЕНЕНИЯ ДЛЯ ДЕМО-ЦЕЛЕЙ

"A.....B.....B......B......B......B"

И я хочу найти все возможные последовательности "A ....... B"

Этот код даст мне максимально короткий возврат и выход из цикла while

while($string =~ m/(A(.*?)B)/gi) {
    print "found\n";
    my $substr = $1;
    print $substr."\n";
}

И это даст мне самое длинное и выйдет из цикла while.

$string =~ m/(A(.*)B)/gi

Но я хочу, чтобы он перебрал строку, возвращающую каждое возможное совпадение. Кто-нибудь знает, допускает ли это Perl?

РЕДАКТИРОВАТЬ ДОБАВЛЕНО НУЖНЫМ ВЫХОДОМ НИЖЕ

found
A.....B
found
A.....B.....B
found
A.....B.....B......B
found
A.....B.....B......B......B
found
A.....B.....B......B......B......B

1 Ответ

0 голосов
/ 10 ноября 2018

Существуют различные способы анализа строки, чтобы получить то, что вы хотите.

Например, используйте regex, чтобы пройти по всем A...A подстрокам и обработать каждый захват

use warnings;
use strict;
use feature 'say';

my $s = "A.....B.....B......B......B......B";

while ($s =~ m/(A.*)(?=A|$)/gi) {
    my @seqs = split /(B)/, $1; 
    for my $i (0..$#seqs) {
        say @seqs[0..$i] if $i % 2 != 0;
    }   
}

(?=A|$) - это заблаговременно, поэтому .* соответствует всему, вплоть до A (или концу строки), но A не используется и будет доступно для следующего совпадения. split использует () в шаблоне разделителя, так что разделитель также возвращается (поэтому у нас есть все эти B). Он печатает только для четного числа элементов, поэтому только подстроки, заканчивающиеся разделителем (B здесь).

Вышеуказанные отпечатки

A.....B
A.....B.....B
A.....B.....B......B
A.....B.....B......B......B
A.....B.....B......B......B......B

Могут быть модули биоинформатики, которые делают это, но я не знаком с ними.

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