Расщепление CamelCase в R - PullRequest
       2

Расщепление CamelCase в R

11 голосов
/ 07 декабря 2011

Есть ли способ разбить верблюжьи строки в R?

Я попытался:

string.to.split = "thisIsSomeCamelCase"
unlist(strsplit(string.to.split, split="[A-Z]") )
# [1] "this" "s"    "ome"  "amel" "ase" 

Ответы [ 7 ]

12 голосов
/ 07 декабря 2011
string.to.split = "thisIsSomeCamelCase"
gsub("([A-Z])", " \\1", string.to.split)
# [1] "this Is Some Camel Case"

strsplit(gsub("([A-Z])", " \\1", string.to.split), " ")
# [[1]]
# [1] "this"  "Is"    "Some"  "Camel" "Case" 

Глядя на меня и Рамната, я могу сказать, что мое первоначальное впечатление, что этот вопрос был недостаточно конкретизирован, было поддержано.

И дать Томми и Раманту повышенные голоса за указание [:upper:]

strsplit(gsub("([[:upper:]])", " \\1", string.to.split), " ")
# [[1]]
# [1] "this"  "Is"    "Some"  "Camel" "Case" 
11 голосов
/ 07 декабря 2011

Вот один из способов сделать это

split_camelcase <- function(...){
  strings <- unlist(list(...))
  strings <- gsub("^[^[:alnum:]]+|[^[:alnum:]]+$", "", strings)
  strings <- gsub("(?!^)(?=[[:upper:]])", " ", strings, perl = TRUE)
  return(strsplit(tolower(strings), " ")[[1]])
}

split_camelcase("thisIsSomeGood")
# [1] "this" "is"   "some" "good"
5 голосов
/ 11 апреля 2015

Вот подход с использованием одного регулярного выражения (Lookahead и Lookbehind):

strsplit(string.to.split, "(?<=[a-z])(?=[A-Z])", perl = TRUE)

## [[1]]
## [1] "this"  "Is"    "Some"  "Camel" "Case" 
2 голосов
/ 07 декабря 2011

Это однострочник, использующий пакет gsubfn strapply.Регулярное выражение соответствует началу строки (^), за которой следуют одна или несколько строчных букв ([[:lower:]]+) или (|) заглавная буква ([[:upper:]]), за которой следуют ноль или более строчных букв([[:lower:]]*) и обрабатывает совпадающие строки с c (который объединяет отдельные совпадения в вектор).Как и в случае strsplit, он возвращает список, поэтому мы берем первый компонент ([[1]]):

library(gsubfn)
strapply(string.to.split, "^[[:lower:]]+|[[:upper:]][[:lower:]]*", c)[[1]]
## [1] "this"  "Is"    "Camel" "Case" 
0 голосов
/ 27 марта 2017

Я думаю, что мой другой ответ лучше, чем следующий, но если нужен только разделитель, чтобы разделить ... здесь мы идем:

library(snakecase)
unlist(strsplit(to_parsed_case(string.to.split), "_"))
#> [1] "this"  "Is"    "Some"  "Camel" "Case" 
0 голосов
/ 26 марта 2017

Здесь простое решение с помощью Snakecase + несколько помощников Tidyverse:

install.packages("snakecase")
library(snakecase)
library(magrittr)
library(stringr)
library(purrr)

string.to.split = "thisIsSomeCamelCase"
to_parsed_case(string.to.split) %>% 
  str_split(pattern = "_") %>% 
  purrr::flatten_chr()
#> [1] "this"  "Is"    "Some"  "Camel" "Case" 

Githublink для Snakecase: https://github.com/Tazinho/snakecase

0 голосов
/ 07 декабря 2011

В начале ответа нужно разделить все символы:

sp.x <- strsplit(string.to.split, "")

Затем найдите строковые позиции в верхнем регистре:

ind.x <- lapply(sp.x, function(x) which(!tolower(x) == x))

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

...