R: strsplit в первом экземпляре

Я хотел бы написать команду strsplit, которая захватывает первый ")" и разбивает строку.

Например:

f("12)34)56")
"12" "34)56"

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

Ответ 1

Вы можете получить тот же результат типа списка, что и с strsplit, если вы использовали regexpr, чтобы получить первое совпадение, а затем инвертированный результат regmatches.

x <- "12)34)56"
regmatches(x, regexpr(")", x), invert = TRUE)
# [[1]]
# [1] "12"    "34)56"

Ответ 2

Возможно, было бы безопаснее определить, где находится символ, а затем подстроить его с обеих сторон:

x <- "12)34)56"
spl <- regexpr(")",x)
substring(x,c(1,spl+1),c(spl-1,nchar(x)))
#[1] "12"    "34)56"

Ответ 3

Нужна скорость? Затем перейдите к функциям stringi. См. Тайминги, например. здесь.

library(stringi)
x <- "12)34)56"
stri_split_fixed(str = x, pattern = ")", n = 2)

Ответ 4

Замените первый ( на непечатный символ "\01", а затем strsplit на этом. Вы можете использовать любой символ, который вам нравится, вместо "\01", если он не отображается.

strsplit(sub(")", "\01", "12)34)56"), "\01")

Ответ 5

Другой вариант - использовать str_split в пакете stringr:

library(stringr)
f <- function(string)
{
  unlist(str_split(string,"\\)",n=2))
}
> f("12)34)56")
[1] "12"    "34)56"