我在 R 中处理字符串时遇到了正则表达式问题。
我有 RNAfold 软件提供的数据结构,如下所示:
“....(((..(((((((.((((((((((.........))))))))) ))).)))))))..))).."
这是 miRNA 的典型二级结构,但我还有其他非 miRNA 的序列,看起来有点像这样:
...((((.....))))........................(((((((...((..(((..() (((...((((((.....)))).))...))).))).))...))))))).. ......
第二个序列有两个发夹环,一个在开头,另一个在中间,而第一个序列只有一个发夹环在中间。
点(“.”)代表未配对的核苷酸,而“(”代表与其对应物配对的核苷酸,表示为“)”。
我想分割这个字符串,以便我可以获得结构中的主干。
我想获得的输出是:
输入:
[1] "....(((..((((((((.(((((((((((.........))))))))))).))))))))..))).."
输出:
[1] "....(((..((((((((.(((((((((((........."
[2] "))))))))))).))))))))..))).."
这样我就可以计算分割字符串的数量以及词干的数量。
第二个序列的结果将是:
输入:
[1] ...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......
输出:
[1] "...((((....."
[2] "))))...........(((((((...((..(((..((((...((((((....."
[3] ")))).))...)))).))).))...)))))))......."
所以本质上,我想要的是解析字符串,以便当它们找到“)”符号时将它们分割,保留字符串的所有符号。
我已经尝试使用 strplit() 和一些正则表达式变体,但我一直无法找到窍门...
有什么帮助吗?
谢谢
最佳答案
你可以做 lookahead并查找以右括号结尾且直接位于左括号之后的点。
x <- c("....(((..((((((((.(((((((((((..))))))))))).))))))))..)))..",
"...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......")
strsplit(x, "\\((?=(\\.+\\)))", perl = TRUE)
# [[1]]
# [1] "....(((..((((((((.((((((((((" "..))))))))))).))))))))..))).."
#
# [[2]]
# [1] "...(((" ".....))))...........(((((((...((..(((..((((...((((("
# [3] ".....)))).))...)))).))).))...)))))))......."
关于r - 在 R 中解析字符串并拆分它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49753509/