在 R 中拆分 CamelCase

Posted

技术标签:

【中文标题】在 R 中拆分 CamelCase【英文标题】:Splitting CamelCase in R 【发布时间】:2012-01-14 11:19:35 【问题描述】:

有没有办法在 R 中拆分驼峰式字符串?

我已经尝试过:

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

【问题讨论】:

【参考方案1】:
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" 

看看 Ramnath 和我的问题,我可以说我最初的印象是,这是一个未充分说明的问题。

并为 Tommy 和 Ramanth 点赞[:upper:]

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

【讨论】:

那么,如果字符串类似于“AB DevelopmentsAndy”,我可能想将其重新创建为“AB Developments Andy”。也就是说,我不想分割连续的大写字符。只是小写然后大写彼此相邻的那些。 您应该阅读?regex 并找到小写字符的正确模式,并为任意数量的小写字符使用正确的符号。【参考方案2】:

这是一种方法

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"

【讨论】:

+1 因为这适用于国际大写字母(不仅仅是 A-Z) - 例如,"enÖIHavet"【参考方案3】:

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

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

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

【讨论】:

很好,而且,因为它不会在连续的大写之间分割,所以是首选。更好的是:strsplit(string.to.split, "(?&lt;=[[:lower:]])(?=[[:upper:]])", perl = TRUE)【参考方案4】:

这是一个使用gsubfn 包的strapply 的单行代码。正则表达式匹配字符串的开头 (^) 后跟一个或多个小写字母 ([[:lower:]]+) 或 (|) 一个大写字母 ([[:upper:]]) 后跟零个或多个小写字母([[:lower:]]*) 并使用c 处理匹配的字符串(它将单个匹配项连接成一个向量)。与strsplit 一样,它返回一个列表,因此我们采用第一个组件([[1]]):

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

【讨论】:

【参考方案5】:

我认为我的其他答案比下面的要好,但如果只需要一个单线来拆分......我们开始吧:

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

【讨论】:

【参考方案6】:

答案的开头是拆分所有字符:

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

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

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

然后使用它来拆分每个字符运行。 . .

【讨论】:

【参考方案7】:

这是一个简单的解决方案,通过蛇盒 + 一些 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" 

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

【讨论】:

我没有投反对票,但我猜是因为这个答案要复杂得多,并且相对于其他 1 到 2 行答案而言,需要模糊的软件包。 我仍然喜欢这个答案,因为它非常干净并且可以格式化输出。所以我把它留在这里,只是在上面提供了一个oneliner......

以上是关于在 R 中拆分 CamelCase的主要内容,如果未能解决你的问题,请参考以下文章

如何在 r 的新列中拆分逗号

在 R 中拆分大型数据集的有效方法

R:如何在 foreach %dopar% 中拆分数据帧

将数据划分为训练、测试和验证 - 在 R 中拆分

如何在多数据集R中使用分解条件和计算拆分和移动行

在 R 中拆分大型数据框并输出到单个 Excel 工作簿中的单独工作表中