規定的位置向左或向右讀this question,我認爲以下問題將使用StringSplit
「StringCut」來使用Mathematica
簡單考慮下面的字符串,我要來「切割」它向左每一個 「d」,使得:
我得到碎片的列表(帶序列不變)
StringJoin
@fragments給巴ck原始字符串(但如果我必須重新排序片段以獲取此內容則無關緊要)。也就是說,每個片段內的序列都很重要,我不想丟失任何字符。
(我對的例子是蛋白序列(串),其中每個字符表示在單字母代碼的氨基酸。我想獲得通過用酶處理所獲得的所有片段的理論列表已知的「d」)
str = "MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"
我可以想出是之前每個「d」,以插入一個空格使用StringReplace
,然後使用StringSplit
最好之前分裂。至少可以這麼說,這似乎相當尷尬。
frags1 = [email protected][str, "D" -> " D"]
給作爲輸出:
{"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
,或者可選地,使用StringReplacePart
:
frags1alt =
[email protected][str, " D", StringPosition[str, "D"]]
最後(更實際地),如果我想 「d」 之前,分裂條件是前面的殘基不是「P」[即PD,(Pro-Asp)鍵未被切割],我這樣做如下:
[email protected][str, (x_ /; x != "P") ~~ "D" -> x ~~ " D"]
有沒有更優雅的方式?
速度不一定是問題。我不太可能處理的字符串大於500個字符。我使用的MMA的7
更新
我已經添加了生物信息學的標籤,我認爲它可能有興趣從字段添加一個例子。
以下使用eutils從NCBI database輸入蛋白質序列(牛血清白蛋白,登錄號3336842),然後生成(理論)trypsin消化物。假設A2不是「R」,「K」或「P」,我認爲當A 1是「R」或「K」時,anticin酶在殘基A1-A2之間裂解。如果有人有任何改進建議,請隨時提出修改建議。
使用sakra方法的修改(回車後'?分貝=」可能需要被移除):
StringJoin /@
Split[Characters[#],
And @@ Function[x, #1 != x] /@ {"R", "K"} ||
Or @@ Function[xx, #2 == xx] /@ {"R", "K", "P"} &] & @
[email protected]
[email protected][
"http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=\
protein&id=3336842&rettype=fasta&retmode=text", "Data"]
我可能笨拙在使用正則表達式的方法(薩沙/ WReach)做同樣的事情嘗試:
StringSplit[#, RegularExpression["(?![PKR])(?<=[KR])"]] &@
[email protected]@Import[...]
輸出
{MK,WVTFISLLLLFSSAYSR,GVFRR,<<69>>,CCAADDK,EACFAVEGPK,LVVSTQTALA}
@ Mr.Wizard。感謝那些不錯的編輯。 – tomd 2011-06-03 14:45:15