Как я могу найти первое вхождение шаблона в строке от некоторой стартовой позиции?

Я приведу пример, чтобы сделать его более ясным:

  • x: входное изображение формы [2, 3], 1 канал
  • valid_pad : max pool с ядром 2x2, шагом 2 и VALID.
  • same_pad: максимальный пул с ядром 2x2, шаг 2 и SAME padding (это классический способ пойти)

Формы вывода:

  • valid_pad: здесь нет прокладки, поэтому форма вывода [1, 1]
  • same_pad: здесь , мы вставляем изображение в форму [2, 4] (с помощью -inf, а затем применяем максимальный пул), поэтому форма вывода [1, 2]

x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.]])

x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool

valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')

valid_pad.get_shape() == [1, 1, 1, 1]  # valid_pad is [5.]
same_pad.get_shape() == [1, 1, 2, 1]   # same_pad is  [5., 6.]
< ч>
6
задан brian d foy 7 November 2008 в 21:11
поделиться

5 ответов

Moritz говорит, что это могло бы быть быстрее, чем regex. Даже если это немного медленнее, легче понять в 5:00.:)

             #0123456789.123456789.123456789.  
my $string = "alsdhfaaasccclaaaagalkfgblkgbklfs";  
my $pos    = 9;  
my $length = 3;  
my $regex  = qr/^(aaa|bbb|ccc)/;

while( $pos < length $string )    
    {  
    print "Checking $pos\n";  

    if( substr( $string, $pos, $length ) =~ /$regex/ )
        {
        print "Found $1 at $pos\n";
        last;
        }

    $pos += $length;
    }
12
ответ дан 8 December 2019 в 02:47
поделиться
$string=~/^   # from the start of the string
            (?:.{$p0}) # skip (don't capture) "$p0" occurrences of any character
            (?:...)*?  # skip 3 characters at a time,
                       # as few times as possible (non-greedy)
            (aaa|bbb|ccc) # capture aaa or bbb or ccc as $1
         /x;

(Принимающий p0 на основе 0).

Конечно, вероятно, более эффективно использовать substr на строке для пропуска вперед:

substr($string, $p0)=~/^(?:...)*?(aaa|bbb|ccc)/;
12
ответ дан 8 December 2019 в 02:47
поделиться

Вы не можете действительно рассчитать с regexes, но можно сделать что-то вроде этого:

pos $string = $start_from;
$string =~ m/\G         # anchor to previous pos()
            ((?:...)*?) # capture everything up to the match
            (aaa|bbb|ccc)
            /xs  or die "No match"
my $result = length($1) / 3;

Но я думаю, что это немного быстрее, чтобы использовать substr () и распаковать (), чтобы разделить на тройной и обойти утраивание в для цикла.

(редактирование: это - длина (), не длина () ;-)

9
ответ дан 8 December 2019 в 02:47
поделиться

Основная часть этого разделяется / (...)/. Но в конце этого, у Вас будут свои положения и данные возникновения.

my @expected_triplets = qw<aaa bbb ccc>;
my $data_string      
    = 'fjeidoaaaivtrxxcccfznaaauitbbbfzjasdjfncccftjtjqznnjgjaaajeitjgbbblafjan'
    ;
my $place          = 0;
my @triplets       = grep { length } split /(...)/, $data_string;
my %occurrence_for = map { $_, [] } @expected_triplets;
foreach my $i ( 0..@triplets ) {
    my $triplet = $triplets[$i];
    push( @{$occurrence_for{$triplet}}, $i ) if exists $occurrence_for{$triplet};
}

Или для простого подсчета regex (это использует Экспериментальный (?? {}))

my ( $count, %count );
my $data_string      
    = 'fjeidoaaaivtrxxcccfznaaauitbbbfzjasdjfncccftjtjqznnjgjaaajeitjgbbblafjan'
    ;
$data_string =~ m/(aaa|bbb|ccc)(??{ $count++; $count{$^N}++ })/g;
0
ответ дан 8 December 2019 в 02:47
поделиться

Если скорость является серьезным беспокойством, Вы можете, в зависимости от того, каковы 3 строки, становятся действительно необычными путем создания дерева (например, алгоритм Aho-Corasick или подобный).

Карта для каждого возможного состояния возможна, например, состояния [0] = 0, если никакие строки не начинаются с 'a'.

0
ответ дан 8 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: