2016-08-08 61 views
0

讓我們看一個爲例:獲得2子/前,後最後第n組「_」

abc_def_ghi_jkl 

如果讓我選擇n = 1,我所要的輸出是:

group1 = abc_def_ghi 
group2 = jkl 

如果我選擇n = 2我所要的輸出是:

group1 = abc_def 
group2 = ghi_jkl 

分開兩組的_被刪除。

現在我只能想出如何選擇最後一組,但它也選擇_

(?:.(?!(?=\_)))+$ 

注2我目前專注於正則表達式的一部分,但它是在要使用的代碼R是否有助於解決問題。

+1

是否有使用正則表達式的具體原因是什麼?對我來說,在''_''上使用'strsplit'然後粘貼(...,collapse ='_')似乎是解決這個特定示例的更簡單的解決方案。 – Vandenman

+0

太簡單了... 3個小時,我看錯了方法。謝謝 ! 但是,我仍然好奇地瞭解更多關於正則表達式,所以如果任何人有答案:) –

+1

那麼,可以有一個基於正則表達式的答案與匹配的組,如['^(。*?)_((?:_ ?[^ _] +){3})$'](https://regex101.com/r/rW0sE8/1)。替換'{...}'中的數字以獲得您需要的部分。就在你使用範圍之外的數字時,行爲可能會變得很奇怪。 –

回答

1

_第n次出現在字符串的結尾分裂一種可能性:

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){0}[^_]*$)", perl = T) 
            # ^
            # you can modify the quantifier here 
#[[1]]           
#[1] "abc_def_ghi" "jkl"     # split on the 1st 

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){1}[^_]*$)", perl = T) 
#[[1]] 
#[1] "abc_def" "ghi_jkl"     # split on the 2nd 

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){2}[^_]*$)", perl = T) 
#[[1]] 
#[1] "abc"   "def_ghi_jkl"   # split on the 3rd 

_(?=([^_]*_){2}[^_]*$)查找_模式([^_]*_){2}[^_]*$前通過?=向前看語法和模式從的末尾開始字符串$,並跳過任何非_模式[^_]*並匹配([^_]*_)一定次數的出現次數,然後在指定的_上進行分裂。

更新str_matchstringr包:

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){0}[^_]*$)")[,2:3] 
# [1] "abc_def_ghi" "jkl"  

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){1}[^_]*$)")[,2:3] 
# [1] "abc_def" "ghi_jkl" 

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){2}[^_]*$)")[,2:3] 
# [1] "abc"   "def_ghi_jkl"