Frage Aufspalten CamelCase in R


Gibt es eine Möglichkeit, Kamelzeichenfolgen in R zu teilen?

Ich habe versucht:

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

10
2017-12-06 21:18


Ursprung


Antworten:


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" 

Mit Blick auf Ramnath und meins kann ich sagen, dass mein erster Eindruck, dass dies eine unterspezifizierte Frage war, unterstützt wurde.

Und geben Sie Tommy und Ramanth Upvotes für das Aufzeigen [:upper:]

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

10
2017-12-06 21:26



Hier ist eine Möglichkeit, es zu tun

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"

11
2017-12-06 21:24



Hier ist ein Ansatz mit einem einzigen Regex (Lookahead und Lookbehind):

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

## [[1]]
## [1] "this"  "Is"    "Some"  "Camel" "Case" 

5
2018-04-11 02:09



Hier ist ein One-Liner mit der gsubfn Pakete strapply. Der reguläre Ausdruck entspricht dem Anfang der Zeichenfolge (^) gefolgt von einem oder mehreren Kleinbuchstaben ([[:lower:]]+) oder (|) ein Großbuchstabe ([[:upper:]]) gefolgt von null oder mehr Kleinbuchstaben ([[:lower:]]*) und verarbeitet die übereinstimmenden Strings mit c (die die einzelnen Übereinstimmungen zu einem Vektor verkettet). Wie mit strsplit es gibt eine Liste zurück, so nehmen wir die erste Komponente ([[1]]):

library(gsubfn)
strapply(string.to.split, "^[[:lower:]]+|[[:upper:]][[:lower:]]*", c)[[1]]
## [1] "this"  "Is"    "Camel" "Case" 

1
2017-12-06 22:08



Der Anfang einer Antwort besteht darin, alle Zeichen aufzuteilen:

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

Finde dann heraus, welche String-Positionen in Großbuchstaben stehen:

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

Verwenden Sie das dann, um jeden Zeichenlauf aufzuteilen. . .


0
2017-12-06 21:26



Ich denke, meine andere Antwort ist besser als die folgende, aber wenn nur ein oneliner zum Teilen benötigt wird ... hier gehen wir:

library(snakecase)
unlist(strsplit(to_parsed_case(string.to.split), "_"))
#> [1] "this"  "Is"    "Some"  "Camel" "Case" 

0
2018-03-27 09:55



Hier eine einfache Lösung über den Schlangenkoffer + einige ordentliche Helfer:

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 zum Schlangenkasten: https://github.com/Tazinho/snakecase


-1
2018-03-25 22:16