Прочитав этот вопрос , я подумал, что следующая проблема будет простой, используя StringSplit
Учитывая следующую строку, я хочу «разрезать» ее слева от каждой буквы «D» так, чтобы:
Я получаю Список фрагментов (с неизменной последовательностью)
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}