'StringCut' слева или справа от определенной позиции с использованием Mathematica

Прочитав этот вопрос , я подумал, что следующая проблема будет простой, используя StringSplit

Учитывая следующую строку, я хочу «разрезать» ее слева от каждой буквы «D» так, чтобы:

  1. Я получаю Список фрагментов (с неизменной последовательностью)

  2. StringJoin @fragments возвращает исходную строку (но это не имеет значения, если мне нужно переупорядочить фрагменты, чтобы получить это ). То есть важна последовательность внутри каждого фрагмента, и я не хочу терять какие-либо символы.

(Пример, который меня интересует, представляет собой последовательность белка (строку), где каждый символ представляет аминокислоту в однобуквенном коде. Я хочу получить теоретический список ВСЕХ фрагментов, полученных обработкой ферментом, расщепляющимся до "D")

str = "MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"

Лучшее, что я могу придумать, - это вставить пробел перед каждым "D", используя StringReplace , а затем используйте StringSplit . Это, мягко говоря, кажется довольно неловким.

frags1 = StringSplit@StringReplace[str, "D" -> " D"]

дает в качестве вывода:

{"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}

или, альтернативно, using StringReplacePart :

frags1alt = 
 StringSplit@StringReplacePart[str, " D", StringPosition[str, "D"]]

Наконец (и более реалистично), если я хочу разделить перед «D», при условии, что остаток, непосредственно предшествующий ему, не является «P» [т.е. PD, (Pro-Asp) связями не раскалываются], я делаю это так:

StringSplit@StringReplace[str, (x_ /; x != "P") ~~ "D" -> x ~~ " D"]

А есть более изящный способ?

Скорость - не обязательно проблема. Я вряд ли буду иметь дело со строками, превышающими, скажем, 500 символов. Я использую Mma 7.

Обновление

Я добавил тег биоинформатики и подумал, что может быть интересно добавить пример из этой области.

Следующее импортирует последовательность белка (бычий сывороточный альбумин, номер доступа 3336842) из ​​базы данных NCBI с использованием eutils , а затем генерирует (теоретический) дайджест трипсина . Я предположил, что фермент трипсин расщепляет остатки А1-А2, когда А1 представляет собой либо «R», либо «К», при условии, что А2 не является «R», «К» или «Р». Если у кого-то есть предложения по улучшению, пожалуйста, не стесняйтесь предлагать модификации.

Использование модификации метода sakra (возможно, необходимо удалить возврат каретки после '? Db ='):

StringJoin /@ 
   Split[Characters[#], 
    And @@ Function[x, #1 != x] /@ {"R", "K"} || 
      Or @@ Function[xx, #2 == xx] /@ {"R", "K", "P"} &] & @
 StringJoin@
  Rest@Import[
    "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=\
protein&id=3336842&rettype=fasta&retmode=text", "Data"]

Моя, возможно, неуклюжая попытка при использовании метода регулярных выражений (Sasha / WReach) сделать то же самое:

StringSplit[#, RegularExpression["(?![PKR])(?<=[KR])"]] &@
 StringJoin@Rest@Import[...]

Выход

{MK,WVTFISLLLLFSSAYSR,GVFRR,<<69>>,CCAADDK,EACFAVEGPK,LVVSTQTALA}

9
задан Community 23 May 2017 в 11:48
поделиться