我在某种程度上处理R中的字符串的正则表达式问题。
我有RNAfold软件提供的数据结构,如下所示:
” ....(((..(((((((((((((((((((.........)))))))) )))。))))))))...)))..“
这是miRNA的典型二级结构,但我也有其他不是miRNA的序列,看起来很像这样:
...((((.....))))...........(((((((...((..(((..( (((...((((((.....))))))...)))))))))...))))))).. .....
第二个序列有两个发夹环,一个在开头,另一个在中间,而第一个序列在中间只有一个发夹环。
点(“。”)表示未配对的核苷酸,而“(”表示与其对应物配对的核苷酸,表示为“)”。
我想拆分这个字符串,以便我可以在结构中获取词干。
我想获得的输出是:
输入:
[1] "....(((..((((((((.(((((((((((.........))))))))))).))))))))..))).."
输出:
[1] "....(((..((((((((.(((((((((((........."
[2] "))))))))))).))))))))..))).."
这样我就可以计算分裂字符串的数量并计算字干数。
第二个序列的结果是:
输入:
[1] ...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......
输出:
[1] "...((((....."
[2] "))))...........(((((((...((..(((..((((...((((((....."
[3] ")))).))...)))).))).))...)))))))......."
因此,在我看来,我想要的是解析字符串,以便在它们找到“)”符号时将它们分开,保留字符串的所有符号。
我已经尝试过使用strplit()和一些正则表达式的变种,但我还是找不到诀窍......
任何帮助?
由于
答案 0 :(得分:2)
您可以执行lookahead并查找以右括号结尾的点,该括号直接在左括号后面。
x <- c("....(((..((((((((.(((((((((((..))))))))))).))))))))..)))..",
"...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......")
strsplit(x, "\\((?=(\\.+\\)))", perl = TRUE)
# [[1]]
# [1] "....(((..((((((((.((((((((((" "..))))))))))).))))))))..))).."
#
# [[2]]
# [1] "...(((" ".....))))...........(((((((...((..(((..((((...((((("
# [3] ".....)))).))...)))).))).))...)))))))......."
答案 1 :(得分:0)
如果您想要计算角色,可能会更方便:
x <- "...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...)))))))......."
with(rle(strsplit(x, "")[[1]]), setNames(lengths, values))
## . ( . ) . ( . ( . ( . ( . ( . ) . ) . ) . ) . ) . ) .
## 3 4 5 4 11 7 3 2 2 3 2 4 3 6 5 4 1 2 3 4 1 3 1 2 3 7 7
答案 2 :(得分:0)
您可以使用 DavidArenburg&#39; 逻辑来获取您指定的输出,但有一个扭曲 - David 使用lookahead
正则表达式来查找{ {1}}位于模式(
之前,其中.{N})
可以是任意数字。可变长度的lookbehind(其中pattern包含未指定的 a 字符的#)将是理想的但不起作用(读取 - 不允许)。诀窍是反转字符串以使用可变长度的前瞻,就像可变长度的lookbehind可能会运行一样。
数据
N
功能
S <- c("....(((..((((((((.(((((((((((.........))))))))))).))))))))..)))..", "...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......")
结果
reverse_string <- function(S) {
paste(rev(unlist(strsplit(S, ""))), collapse="")
}
myfun <- function(S) {
T <- reverse_string(S)
result <- unlist(strsplit(T, "\\)(?=(\\.+\\())", perl = TRUE))
setNames(rev(sapply(result, function(i) reverse_string(i))), NULL)
}