上_
第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_match
從stringr
包:
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"
是否有使用正則表達式的具體原因是什麼?對我來說,在''_''上使用'strsplit'然後粘貼(...,collapse ='_')似乎是解決這個特定示例的更簡單的解決方案。 – Vandenman
太簡單了... 3個小時,我看錯了方法。謝謝 ! 但是,我仍然好奇地瞭解更多關於正則表達式,所以如果任何人有答案:) –
那麼,可以有一個基於正則表達式的答案與匹配的組,如['^(。*?)_((?:_ ?[^ _] +){3})$'](https://regex101.com/r/rW0sE8/1)。替換'{...}'中的數字以獲得您需要的部分。就在你使用範圍之外的數字時,行爲可能會變得很奇怪。 –