【发布时间】:2018-09-20 01:35:04
【问题描述】:
我在处理 R 中的字符串时遇到了某种正则表达式问题。
我有 RNAfold 软件提供的数据结构,如下所示:
"....(((..(((((((((.(.((((((((((((.........)))))))) ))).))))))))..))).."
这是 miRNA 的典型二级结构,但我也有其他不是 miRNA 的序列,看起来有点像这样:
...((((.....))))............(((((((((...)(..(((..( (((...(((((.....)))).))...))).))).))...))))))).. .....
第二个序列有两个发夹环,一个在开头,另一个在中间,而第一个序列只有一个发夹环在中间。
点(“.”)表示未配对的核苷酸,而“(”表示与其对应的核苷酸配对,表示为“)”。
我想拆分这个字符串,以便我可以得到结构中的词干。
我想得到的输出是:
输入:
[1] "....(((..((((((((.(((((((((((.........))))))))))).))))))))..))).."
输出:
[1] "....(((..((((((((.(((((((((((........."
[2] "))))))))))).))))))))..))).."
这样我就可以数出分割的字符串数和词干数了。
第二个序列的结果是:
输入:
[1] ...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......
输出:
[1] "...((((....."
[2] "))))...........(((((((...((..(((..((((...((((((....."
[3] ")))).))...)))).))).))...)))))))......."
所以本质上,我想要的是解析字符串,以便在找到“)”符号时将它们拆分,保留字符串的所有符号。
我已经尝试过使用 strplit() 和一些正则表达式变体,但我没能找到诀窍...
有什么帮助吗?
谢谢
【问题讨论】:
-
如果
x是您的字符串,您可以使用strsplit(x, "\\((?=(\\.+\\)))", perl = TRUE)[[1]],但这会将点保留在新字符串的开头而不是前一个字符串的结尾 -
啊啊,差异与我想要的无关。非常感谢!!!!
-
我真的不明白您的预期结果应该是什么,以及在这种情况下您所说的“茎”是什么意思:茎环结构的“茎”通常是 配对的 地区。目前尚不清楚这如何对应于您想要的输出。 — 话虽如此,这是一个众所周知的非常规字符串,这意味着正则表达式是分析它的错误工具。你也许可以用正则表达式破解一些东西,但我真诚的建议是,不要——改用正确的工具:上下文无关语法。