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的事情,因为这个问题最像我的问题(但不完全),但无济于事。
任何帮助将不胜感激。
答案 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)