我有一个字符串(fasta格式),如下所示:
a = ">atttaggacctta\nattgtcggta\n>ccattnnnn\ncccatt\n>ttaggccta"
并希望分隔字符>
,过滤掉换行符并将>
分隔的thre子字符串放入包含三个元素的向量或列表中:
>atttaggaccttaattgtcggta
>ccattnnnncccatt
>ttaggccta
我尝试了strsplit
:
unlist(strsplit(a, "(?<=>)", perl=T))
但是这会将分隔符>
放在每个字符串的末尾。
我发现相关问题是options或here,但我无法在不制作复杂构造的情况下将其付诸实践。
有一个简单的解决方案可以一次完成吗?
答案 0 :(得分:2)
您的正则表达式只包含一个与>
之后的任何空位匹配的lookbehind,请参阅your regex demo。引擎从左到右处理一个字符串,检查当前位置左侧是否有>
,然后在找到<
时返回有效的空字符串匹配。
您可以使用(?<=[^>])(?=>)
正则表达式:
> res <- unlist(strsplit(a, "(?<=[^>])(?=>)", perl=T))
> res
[1] ">atttaggacctta\nattgtcggta\n" ">ccattnnnn\ncccatt\n"
[3] ">ttaggccta"
> gsub("\n", "", res, fixed=TRUE)
[1] ">atttaggaccttaattgtcggta" ">ccattnnnncccatt"
[3] ">ttaggccta"
该模式匹配一个前面带有非>
字符的位置,后面跟着>
字符。
请注意,仅使用strsplit
的lookbehind模式通常会导致意外行为。见Why does strsplit use positive lookahead and lookbehind assertion matches differently?
答案 1 :(得分:1)
library(stringi)
library(magrittr)
a <- ">atttaggacctta\nattgtcggta\n>ccattnnnn\ncccatt\n>ttaggccta"
stri_replace_all_regex(a, "\\n", "") %>%
stri_extract_all_regex("(>[[:alpha:]]+)") %>%
unlist()
## [1] ">atttaggaccttaattgtcggta" ">ccattnnnncccatt" ">ttaggccta"
如果必须只使用base:
a <- gsub("\\n", "", a)
unlist(regmatches(a, gregexpr("(>[[:alpha:]]+)", a)))