tom*_*omd 9 string wolfram-mathematica bioinformatics
在阅读这个问题时,我认为以下问题很简单StringSplit
给定以下字符串,我想在每个"D"的左侧"剪切"它,以便:
我得到一个片段列表(序列不变)
StringJoin@fragments返回原始字符串(但如果我必须重新排序片段以获得此字符串,则无关紧要).也就是说,每个片段中的序列很重要,我不想丢失任何字符.
(我感兴趣的例子是蛋白质序列(字符串),其中每个字符代表一个字母代码中的氨基酸.我想获得通过用已知在"D"之前分裂的酶处理获得的所有片段的理论列表. )
str = "MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的是在每个"D"之前插入一个空格StringReplace然后使用StringSplit.至少可以说,这似乎很尴尬.
frags1 = StringSplit@StringReplace[str, "D" -> " D"]
Run Code Online (Sandbox Code Playgroud)
作为输出:
{"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)
或者,使用StringReplacePart:
frags1alt =
StringSplit@StringReplacePart[str, " D", StringPosition[str, "D"]]
Run Code Online (Sandbox Code Playgroud)
最后(更现实地),如果我想在"D"之前分裂,前提是它前面的残留物不是"P"[即PD,(Pro-Asp)键未被切割],我这样做:
StringSplit@StringReplace[str, (x_ /; x != "P") ~~ "D" -> x ~~ " D"]
Run Code Online (Sandbox Code Playgroud)
有更优雅的方式吗?
速度不一定是个问题.我不太可能处理大于500个字符的字符串.我正在使用Mma 7.
更新
我添加了生物信息学标签,我认为从该领域添加一个例子可能会引起兴趣.
以下使用eutils从NCBI数据库中导入蛋白质序列(牛血清白蛋白,登录号3336842),然后产生(理论上的)胰蛋白酶消化物.假设A2不是"R","K"或"P",我认为当A1是"R"或"K"时,酶tripin在残基A1-A2之间切割.如果有人有任何改进建议,请随时提出修改建议.
使用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"]
Run Code Online (Sandbox Code Playgroud)
我可能会尝试使用正则表达式方法(Sasha/WReach)做同样的事情:
StringSplit[#, RegularExpression["(?![PKR])(?<=[KR])"]] &@
StringJoin@Rest@Import[...]
Run Code Online (Sandbox Code Playgroud)
产量
{MK,WVTFISLLLLFSSAYSR,GVFRR,<<69>>,CCAADDK,EACFAVEGPK,LVVSTQTALA}
Run Code Online (Sandbox Code Playgroud)
我无法构建任何比你的代码更简单的东西.这是一个正则表达式代码,您可能会喜欢:
In[281]:= StringSplit@
StringReplace[str, RegularExpression["(?<!P)D"] -> " D"]
Out[281]= {"MTPDKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", \
"DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)
它使用负面的lookbehind模式,借鉴了这个网站.
In[2]:= StringSplit[str, RegularExpression["(?<!P)(?=D)"]]
Out[2]= {"MTPDKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", \
"DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)
以下是一些替代解决方案:
按任何出现的“D”进行拆分:
In[18]:= StringJoin /@ Split[Characters["MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"], #2!="D" &]
Out[18]:= {"MTP", "DKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)
通过任何出现的“D”进行拆分,前提是它前面没有“P”:
In[19]:= StringJoin /@ Split[Characters["MTPDKPSQYDKIEAELQDICNDVLELLDSKGDYFRYLSEVASGDN"], #2!="D" || #1=="P" &]
Out[19]:= {"MTPDKPSQY", "DKIEAELQ", "DICN", "DVLELL", "DSKG", "DYFRYLSEVASG", "DN"}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |