perl: получить подстроку до последнего появления символа - PullRequest
0 голосов
/ 19 декабря 2018

В Perl, отсюда:

gi|1339058241|ref|XP_023717639.1|zinc finger and BTB domain-containing protein 18-like [Cryptotermes secundus]

если мой персонаж |, как я могу получить строку:

gi|1339058241|ref|XP_023717639.1|

спасибо.

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Я распознаю их как строки заголовков NCBI seq, так что я знаю, что они имеют фиксированное количество полей.

Поскольку это поля / столбцы, вы можете разделить и объединить:

my @rec = split(/\|/, $id);
my $idShort = join("|", @rec[0..3]);
print $idShort, "\n";

Или вы можете использовать регулярное выражение:

if ($id =~ /^(gi\|\d+\|\w+\|[\w\_]+\.\d+\|)/) { print "$1\n" } else { die("Unparseable: $id\n") }

Но мне нравится использование Hambone вRindex.

0 голосов
/ 19 декабря 2018

Вот еще одно решение, которое работает путем удаления всех символов, отличных от | в конце данной строки.

use strict;
use warnings;

my $str = "gi|1339058241|ref|XP_023717639.1|zinc finger and BTB domain-containing protein 18-like [Cryptotermes secundus]";

$str =~ s/[^|]*$//;
print "$str\n;"

Объяснение:

  • [^|]является классом символов : он соответствует любому символу, но | («но» обозначается символом ^)
  • * - это квантификатор, означающий от 0 до Nсимволы
  • $ представляет конец строки
0 голосов
/ 19 декабря 2018

Вы можете использовать rindex, который похож на index, только он ищет справа вместо левой части строки - вытягивая последнее вхождение строки вместо первой:

substr($str, 0, rindex ($str, '|') + 1);
0 голосов
/ 19 декабря 2018

В Perl совпадения по умолчанию "жадные", поэтому вы можете просто сопоставить все, что угодно, вплоть до символа, который вы используете в качестве разделителя:

$foo="gi|1339058241|ref|XP_023717639.1|zinc finger and BTB domain-containing protein 18-like [Cryptotermes secundus]";
$foo =~ /.*\|/; 
print "$&\n"

$& представляет строкусоответствует последнему успешному совпадению с шаблоном, в данном случае все до последнего | символа.

...