Подсчет количества вхождений строки внутри другой (Perl) - PullRequest
34 голосов
/ 02 марта 2012

Какой самый быстрый способ подсчитать, сколько раз определенная строка появляется в большей? Моим лучшим предположением было бы заменить все экземпляры этой строки ничем, вычислить разницу длин и разделить на длину подстроки, но это кажется довольно медленным, и мне нужно проанализировать большие объемы данных.

Ответы [ 4 ]

62 голосов
/ 02 марта 2012

Вы можете захватить строки, а затем сосчитать их. Это можно сделать, применив к списку контекст списка с помощью ():

my $x = "foo";
my $y = "foo foo foo bar";
my $c = () = $y =~ /$x/g;  # $c is now 3

Вы также можете записать в массив и сосчитать массив. Тот же принцип, другая техника:

my @c = $y =~ /$x/g;
my $count = @c;
15 голосов
/ 02 марта 2012
my $string = "aaaabbabbba";
my @count = ($string =~ /a/g);
print @count . "\n";

или

my $count = ($string =~ s/a/a/g);
9 голосов
/ 02 марта 2012

Вы можете использовать глобальное регулярное выражение. Что-то вроде:

my @matches = $bigstring =~ /($littlestring)/g;
my $count = @matches;
5 голосов
/ 20 августа 2013

Просто для полноты вы можете многократно вызывать индексную функцию в цикле и подсчитывать, сколько раз она возвращала индекс подстроки в строке, и изменять начальную позицию.Это позволит избежать использования регулярных выражений, и в моем тестировании это немного быстрее, чем решения регулярных выражений.

Я адаптировал подпрограмму для этого здесь: http://www.misc -perl-info.com /perl-index.html

sub occurrences {

    my( $x, $y ) = @_;

    my $pos = 0;
    my $matches = 0;

    while (1) {
        $pos = index($y, $x, $pos);
        last if($pos < 0);
        $matches++;
        $pos++;
    }   

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