Читая этот вопрос , я подумал, что следующая проблема будет проста с использованием StringSplit
Учитывая следующую строку, я хочу «вырезать» ее слева от каждого »D "такое, что:
Я получаю Список фрагментов (с неизменной последовательностью)
StringJoin
@фрагменты возвращают исходную строку (но это не имеет значения, если мне нужно изменить порядок фрагментов, чтобы получить это).То есть последовательность внутри каждого фрагмента важна, и я не хочу терять никаких символов.
(Пример, который меня интересует, - это последовательность белка (строка), где каждый символ представляетаминокислота в однобуквенном коде. Я хочу получить теоретический список ВСЕХ фрагментов, полученных обработкой ферментом, который, как известно, расщепляется до «D»)
str = "MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"
Лучшее, что я могу придумать, этовставьте пробел перед каждым «D», используя StringReplace
, а затем используйте StringSplit
.Это выглядит довольно неловко, если не сказать больше.
frags1 = StringSplit@StringReplace[str, "D" -> " D"]
выдавая в качестве вывода:
{"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
или, альтернативно, используя 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" или "K", при условии, что А2 не является "R", "K" или "P".Если у кого-то есть предложения по улучшению, пожалуйста, не стесняйтесь предлагать изменения.
Используя модификацию метода Сакры (возможно, необходимо удалить возврат каретки после '? 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}