2014-10-07 4 views
11

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

Например:

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

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

ответ

10

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

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

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

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

Благодаря предложению, но это опасно, так как в общем случае там может быть запятой перед ')', такие как 'strsplit (суб (")",», "", 12) 34) 56"), ","). – fsmart

+0

См. Ревизию. –

2

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

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

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

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

Это может быть безопаснее, чтобы определить, где символ, а затем подстроки по обе стороны от него:

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

 Смежные вопросы

  • Нет связанных вопросов^_^