在R中拆分驼峰命名法

14

有没有一种方法可以在R中分割驼峰命名字符串?

我已经尝试过:

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

17
string.to.split = "thisIsSomeCamelCase"
gsub("([A-Z]){1}", " \\1", string.to.split)
# [1] "this Is Some Camel Case"
# added a counter to prevent situation mentioned in comment
strsplit(gsub("([A-Z]{1})", " \\1", string.to.split), " ")
# [[1]]
# [1] "this"  "Is"    "Some"  "Camel" "Case" 

# another attempt to meet the commenter's concern
# inserts space between lower-single upper sequence
gsub("([[:lower:]])([[:upper:]]){1}", "\\1 \\2", string.to.split)

从Ramnath的和我的角度来看,我可以说我的最初印象是这个问题没有明确说明,这一点得到了支持。

同时,给Tommy和Ramnath点赞,因为他们指出了[:upper:]

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

那么如果字符串是类似于“AB DevelopmentsAndy”的,我可能希望将其重新创建为“AB Developments Andy”。也就是说,我不想拆分连续的大写字符。只想要在小写字母和大写字母相邻的时候进行拆分。 - psychemedia
你应该阅读?regex,找到小写字符的正确模式,并使用任意数量的它们的正确符号。 - IRTFM

11

以下是一种实现方法

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
因为这可以处理国际大写字母(不仅限于 A-Z),所以 +1 - 例如,"enÖIHavet"。 - Tommy

7

以下是一种使用单个正则表达式的方法(前瞻和后顾):

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

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

1
不错,而且更好的是它不会在连续大写字母之间分割。 甚至更好:strsplit(string.to.split, "(?<=[[:lower:]])(?=[[:upper:]])", perl = TRUE) - malcook

2
这里有一个使用包的方法的一行代码。正则表达式匹配字符串开头(^),接着是一个或多个小写字母([[:lower:]]+)或者(|)一个大写字母([[:upper:]])后面跟着零个或多个小写字母([[:lower:]]*),并使用处理匹配到的字符串(将所有匹配结果连接成一个向量)。与类似,它返回一个列表,因此我们取第一个组件([[1]])。
library(gsubfn)
strapply(string.to.split, "^[[:lower:]]+|[[:upper:]][[:lower:]]*", c)[[1]]
## [1] "this"  "Is"    "Camel" "Case" 

1

我认为我的另一个答案比下面的更好,但如果只需要一行代码来分割...我们来试试:

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

0

回答的开端是将所有字符拆分:

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

然后找出哪些字符串位置是大写字母:

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

然后使用它来分割每个字符的运行. . .


-1

这里有一个简单的解决方案,使用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" 

snakecase的Github链接:https://github.com/Tazinho/snakecase


我没有点踩,但我猜测这是因为相对于其他一到两行的回答,这个回答更加复杂,需要使用不常见的包。 - Max Ghenis
我仍然喜欢这个答案,因为它非常干净并格式化输出。所以我把它留在这里,只提供了一个一行代码的解决方案... - Taz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接