Разделить строку с нежадным регулярным выражением через strsplit

У меня проблема с регулярным выражением и strsplit. Я хотел бы разделить следующую строку x на основе второго символа :

x <- "26/11/19, 22:16 - Super Mario: It's a me: Super Mario!, but also : the princess"

и получить что-то вроде этого

"26/11/19, 22:16 - Super Mario"
" It's a me: Super Mario!, but also : the princess"

Я использую by using strsplit со следующим регулярным выражением, которое на основе моего небольшого ноу-хау должно рассуждать как "выбрать ТОЛЬКО символ двоеточия, за которым следует пробел и которому предшествуют ТОЛЬКО буквы".

Я попытался сделать регулярное выражение не жадным с помощью символа ?, но явно что-то упускаю, и результат не работает должным образом, потому что он также включает me: в операцию разделения.

Я думаю, что важно иметь нежадный оператор, потому что строка здесь просто пример, у меня, конечно, не всегда есть слово Mario.

strsplit(x, "(?<=[[:alpha:]]):(?= )", perl = TRUE)

Спасибо в andvance!


person SabDeM    schedule 08.05.2020    source источник
comment
Я запутался. Двоеточие в Mario: является первым, а не вторым двоеточием, за которым следует пробел и предшествует буква. Пожалуйста, будьте более точны в формулировке ваших требований.   -  person Cary Swoveland    schedule 09.05.2020
comment
у вас всегда есть отметка времени? strsplit(x, '\\d.*?:.*?:\\K', perl = TRUE)   -  person rawr    schedule 09.05.2020
comment
Вы имеете в виду разделение на первое двоеточие, за которым следует пробел и которому предшествует буква?   -  person Cary Swoveland    schedule 09.05.2020
comment
@rawr Думаю, ты понял! пожалуйста, добавьте это как ответ ... и, если я могу спросить, не могли бы вы просветить меня о регулярном выражении? Я понимаю (почти) все. Большое спасибо!   -  person SabDeM    schedule 09.05.2020
comment
@SabDeM, я бы не стал ему доверять, в некоторых примерах он может сломаться. он соответствует цифре, за которой следуют два двоеточия, а затем сбрасывается, поэтому, если после второго двоеточия есть цифра, это не сработает. без \\d он будет разделяться после каждых двух двоеточий. Я не знаю достаточно регулярных выражений, чтобы исправить это   -  person rawr    schedule 09.05.2020
comment
@rawr большое спасибо, вы дали мне несколько очень хороших идей. Ценить это!   -  person SabDeM    schedule 09.05.2020
comment
@CarySwoveland Я хочу разделить на основе второго двоеточия.   -  person SabDeM    schedule 09.05.2020
comment
Это означает, что для строк a:b:c: d и a: b:c: d вы хотите разделить двоеточие между b и c. Правильный? Если да, то какова цель выделенного курсивом предложения в вашем вопросе?   -  person Cary Swoveland    schedule 09.05.2020
comment
Правильный; вообще ни к чему, я просто цитирую свои мысли... Я не понимаю вашей точки зрения.   -  person SabDeM    schedule 09.05.2020
comment
Если вы посмотрите на ответ str_split @akrun, вы увидите, что он/она соответствует двоеточию, которому предшествует буква ((?<=[[:alpha:]])), а затем пробел ((?= )). Мы оба поняли, что вас интересует только разделение на двоеточие, которому предшествует буква, а за ним следует пробел. Я предлагаю вам убрать выделенный курсивом пункт.   -  person Cary Swoveland    schedule 09.05.2020


Ответы (1)


Мы можем заменить первое вхождение ':' другим символом или просто воспроизвести его, а затем использовать strsplit

strsplit(sub("([[:alpha:]]):", "\\1::", x),
       "(?<=[[:alpha:]]):{2,}(?= )", perl = TRUE)[[1]]
#[1] "26/11/19, 22:16 - Super Mario"       
#[2] " It's a me: Super Mario!, but also : the princess"

Или с str_split

library(stringr)
str_split(x, "(?<=[[:alpha:]]):(?= )", n = 2)[[1]]
#[1] "26/11/19, 22:16 - Super Mario"   
#[2] " It's a me: Super Mario!, but also : the princess"
person akrun    schedule 08.05.2020
comment
Спасибо, но у меня не всегда Марио, поэтому я решил использовать [[:alpha:]], строка здесь просто пример. - person SabDeM; 09.05.2020