拆分特殊字符串

时间:2016-08-25 10:47:53

标签: regex r string split

我有一个字符串(fasta格式),如下所示:

a = ">atttaggacctta\nattgtcggta\n>ccattnnnn\ncccatt\n>ttaggccta"

并希望分隔字符>,过滤掉换行符并将>分隔的thre子字符串放入包含三个元素的向量或列表中:

>atttaggaccttaattgtcggta >ccattnnnncccatt >ttaggccta

我尝试了strsplit

unlist(strsplit(a, "(?<=>)", perl=T))

但是这会将分隔符>放在每个字符串的末尾。

我发现相关问题是optionshere,但我无法在不制作复杂构造的情况下将其付诸实践。

有一个简单的解决方案可以一次完成吗?

2 个答案:

答案 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)))