Spaccando camelcase in r
-
29-10-2019 - |
Domanda
C'è un modo per dividere le stringhe della custodia a cammello in R?
Ho tentato:
string.to.split = "thisIsSomeCamelCase"
unlist(strsplit(string.to.split, split="[A-Z]") )
# [1] "this" "s" "ome" "amel" "ase"
Soluzione
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"
Guardando Ramnath e il mio posso dire che la mia impressione iniziale che si trattasse di una domanda sottospetificata è stata supportata.
E dai tommy e Ramanth upvotes per aver sottolineato [:upper:]
strsplit(gsub("([[:upper:]])", " \\1", string.to.split), " ")
# [[1]]
# [1] "this" "Is" "Some" "Camel" "Case"
Altri suggerimenti
Ecco un modo per farlo
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"
Ecco un approccio che utilizza un singolo regex (un lookahead e lookbehind):
strsplit(string.to.split, "(?<=[a-z])(?=[A-Z])", perl = TRUE)
## [[1]]
## [1] "this" "Is" "Some" "Camel" "Case"
Ecco un liner che utilizza il gsubfn
pacchi strapply
. L'espressione regolare corrisponde all'inizio della stringa (^
) seguito da una o più lettere minuscole ([[:lower:]]+
) o (|
) una lettera maiuscola ([[:upper:]]
) seguito da zero o più lettere minuscole ([[:lower:]]*
) e elabora le stringhe abbinate con c
(che concatena le singole corrispondenze in un vettore). Come con strsplit
Restituisce un elenco in modo che prendiamo il primo componente ([[1]]
) :
library(gsubfn)
strapply(string.to.split, "^[[:lower:]]+|[[:upper:]][[:lower:]]*", c)[[1]]
## [1] "this" "Is" "Camel" "Case"
L'inizio di una risposta è dividere tutti i personaggi:
sp.x <- strsplit(string.to.split, "")
Quindi trova quali posizioni di stringa sono maiuscole:
ind.x <- lapply(sp.x, function(x) which(!tolower(x) == x))
Quindi usalo per dividere ogni serie di caratteri. . .
Penso che la mia altra risposta sia migliore del follwing, ma se è necessario solo un oneliner a dividere ... eccoli:
library(snakecase)
unlist(strsplit(to_parsed_case(string.to.split), "_"))
#> [1] "this" "Is" "Some" "Camel" "Case"
Qui una soluzione facile tramite SnakeCase + alcuni aiutanti ordinari:
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"
GitubLink a SnakeCase: https://github.com/tazinho/snakecase