Regex 提取多个重叠子串

Regex 提取多个重叠子串,regex,r,string,Regex,R,String,我有这样的氨基酸串: x <- "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*" 作为输出。不出所料,regexpr为我提供了贪婪的解决方案: regmatches(x, regexpr("M.+\\*", x)) #[1] "MEALYRAQVLVDLT*MQLPSSFAALAAQ

我有这样的氨基酸串:

x <- "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"
作为输出。不出所料,
regexpr
为我提供了贪婪的解决方案:

  regmatches(x, regexpr("M.+\\*", x))
 #[1] "MEALYRAQVLVDLT*MQLPSSFAALAAQFDQL*EKEKF*SLIARSLHRPQ**LLMFSLLVASVFTPCSALPFWSIKFTLFILS*SFLISDSILFIRVIDQEIKYVVPL*DLK*LTPDYCKCD*"
我也尝试过一些建议,因为这是一个与我的问题最相似的问题(但不是很相似),但没有效果

任何帮助都将不胜感激

M[^*]+\\*
使用否定字符类。请参阅演示。同时使用
perl=True
选项


使用非贪婪的
+?
而不是
+
,并切换到
gregexpr
进行多个匹配:

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

我将根据您的要求添加一个捕获非重叠模式的选项。我们必须检查我们的比赛中是否有其他模式:

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

你试过不贪婪吗?M.+?\*没有,但有人刚刚在下面的答案中建议了它,而且它是有效的!我不明白,你说你知道贪婪和非贪婪的区别?这怎么可能呢?@Frank-我从来没有见过一个正则表达式教程解释
贪婪
,而不解释
非贪婪
。一个不能没有另一个而存在。@Frank-贪婪跟随量词。量词的解释从来都不是没有贪婪的,了解一个就是了解另一个。谢谢,那太完美了!我试过
gregexpr
,但忘了在我的问题描述中加入。但真正起作用的是非贪婪的
+
,你说的是“非重叠”。这在
x上失败,谢谢!它工作得很好。我尝试过否定
*
,但没有意识到我当时不需要
等。在没有
perl=TRUE
的情况下效果很好(给出与另一个答案相同的结果)。此外,在R中,你必须写所有的大写字母。@Frank我们可以使用
M[^M*]+\\*
,在
MABC*MabcMdef*ghi*
@vks上另一个答案会失败,好的。可以说,改变你的答案似乎为时已晚,正如皮埃尔刚刚发布的那样。由您决定。是的,即使是间歇性的
M
s,也可以。谢谢
regmatches(x, gregexpr("M[^M]+?\\*", x))[[1]]
#[1] "MEALYRAQVLVDLT*"               
#[2] "MQLPSSFAALAAQFDQL*"            
#[3] "MFSLLVASVFTPCSALPFWSIKFTLFILS*"