2015-10-19 23 views
0

我有的氨基酸串是這樣的:提取多個重疊的子

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,因爲這是類似於我的問題最多(但不完全),但無濟於事的問題。

任何幫助,將不勝感激。

+1

您嘗試過非貪婪嗎? M。+?\\ * – lintmouse

+0

不,但有人剛剛在下面的答案中提出了它,它的工作原理! –

+0

我不明白,你說你知道「貪婪」和「非貪婪」之間的區別?怎麼可能 ? – sln

回答

3

我將增加一個選項的非重疊的圖案爲你捕捉請求。我們必須檢查在我們的匹配中還沒有開始另一種模式:

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

是失敗,即使是間歇性的M也是如此 - 謝謝 –

1
M[^*]+\\* 

使用否定的字符class.See demo.Also使用perl=True選項。

https://regex101.com/r/tD0dU9/6

+0

謝謝!它完美地工作。我嘗試否定'*',但沒有意識到我不需要'.'等。 –

+0

沒有'perl = TRUE',可以正常工作(給出和其他答案相同的結果)。此外,在R中,你必須把它全部寫上。 – Frank

+1

@Frank我們可以使用'M [^ M *] + \\ *',其他答案在'MABC * MabcMdef * ghi *' – vks

3

使用非貪婪.+?代替.+,並切換到gregexpr多個匹配:

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

謝謝,這是完美的!在忘記包含在我的問題描述中之前,我嘗試過'gregexpr'。但它是非吝嗇的''+'做的伎倆。 –

+0

你說「不重疊」。這在'x < - 「MABC * MabcMdef * ghi *」' –