提取多个重叠的子串

时间:2015-10-19 15:53:06

标签: regex r string

我有这样的氨基酸串:

x <- "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"

我希望提取所有非重叠的子字符串,以M开头并以*结尾。所以,对于上面的例子,我需要:

#[1] "MEALYRAQVLVDLT*"
#[2] "MQLPSSFAALAAQFDQL*"
#[3] "MFSLLVASVFTPCSALPFWSIKFTLFILS*"

作为输出。可预见的regexpr给了我贪婪的解决方案:

  regmatches(x, regexpr("M.+\\*", x))
 #[1] "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"

我也尝试过建议here的事情,因为这个问题最像我的问题(但不完全),但无济于事。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

使用非贪婪的.+?代替.+,并切换到gregexpr以获取多个匹配:

R> regmatches(x, gregexpr("M.+?\\*", x))[[1]]
#"MEALYRAQVLVDLT*"                
#"MQLPSSFAALAAQFDQL*"             
#"MFSLLVASVFTPCSALPFWSIKFTLFILS*"

答案 1 :(得分:3)

我会根据您的要求添加捕获非重叠模式的选项。我们必须检查在我们的比赛中还没有开始另一种模式:

regmatches(x, gregexpr("M[^M]+?\\*", x))[[1]]
#[1] "MEALYRAQVLVDLT*"               
#[2] "MQLPSSFAALAAQFDQL*"            
#[3] "MFSLLVASVFTPCSALPFWSIKFTLFILS*"

答案 2 :(得分:1)

M[^*]+\\*

使用否定的字符类。参见demo。也可以使用perl=True选项。

http://matplotlib.org/users/customizing.html