2016-08-08 3 views
0

Давайте посмотрим на Exemple:Попадая 2 подстроки/группы до и после последней п-й "_"

abc_def_ghi_jkl 

Если я выбираю n = 1, я хочу выход быть:

group1 = abc_def_ghi 
group2 = jkl 

Если я выбрать n = 2 Я хочу выход быть:

group1 = abc_def 
group2 = ghi_jkl 

Примечание Удалено _, разделяющее две группы.

На данный момент я только понял, как выбрать последнюю группу, но также выбрать _:

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

Примечание2 Я сейчас сосредоточен на регулярных выражениях части, но это код, который будет использоваться в R, если это помогает добраться до решения.

+1

Есть ли конкретная причина использовать регулярное выражение? Для меня использование 'strsplit' в' '_'', за которым следует' paste (..., collapse = '_') ', похоже, является более простым решением для решения этого конкретного примера. – Vandenman

+0

Так просто ... 3 часа, что я рассматриваю проблему неправильно. Благодаря ! Мне все еще интересно узнать больше о регулярном выражении, поэтому, если у кого-то есть ответ :) –

+1

Ну, может быть ответ на основе регулярного выражения с соответствующими группами, например ['^ (. *?) _ ((?: _) ? [^ _] +) {3}) $ '] (https://regex101.com/r/rW0sE8/1). Замените номер внутри '{...}', чтобы получить нужные вам детали. Просто, когда вы используете число за пределами диапазона, поведение может стать странным. –

ответ

1

Возможность разделить на п-й возникновения _ с конца строки:

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}[^_]*$ через ?= смотреть вперед синтаксис и шаблон начинается с конца строка $ и пропускает любые не _ шаблоны [^_]* и соответствует ([^_]*_) для определенного количества вхождений и после этого разделить на указанные _.

Update с 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" 
Смежные вопросы