【问题标题】:R: Capitalizing everything after a certain characterR:在某个字符之后大写所有内容
【发布时间】:2012-05-29 08:09:13
【问题描述】:

我想将第一个 _ 之后的字符向量中的所有内容大写。例如下面的向量:

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f") 

应该是这样的:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

我一直在尝试使用regular expressions,但我无法做到这一点。任何建议,将不胜感激。

【问题讨论】:

  • gsub("(\\_*)", "", x) 选择 _,但不选择字符串的其余部分。帮助表中有关于大写的很好的例子。

标签: regex r capitalization


【解决方案1】:

你们很亲密:

gsub("(_.*)","\\U\\1",x,perl=TRUE)

似乎有效。您只需要使用_.*(下划线后跟零个或多个其他字符)而不是_*(零个或多个下划线)...

再分解一下:

  • _.* 给出了一个正则表达式模式,它匹配下划线_ 后跟任意数量(包括 0)的附加字符; . 表示“任何字符”,* 表示“前一个元素的零个或多个重复”
  • 用括号括起来这个正则表达式()表示它是我们要存储的模式
  • 替换字符串中的\\1 表示“插入第一个匹配模式的内容”,即任何匹配的_.*
  • \\Uperl=TRUE 结合使用,表示“将后面的内容大写”(大写 _ 无效;如果我们想(例如)小写 g 之后的所有内容都大写,我们需要从存储的模式中排除 g 并将其包含在替换模式中:gsub("g(.*)","g\\U\\1",x,perl=TRUE))

有关更多详细信息,请在?gsub 中搜索“替换”和“大写”(和?regexp 以获取有关正则表达式的一般信息)

【讨论】:

  • +1 表示"\\U\\1"。以前在 R 中从未见过这种正则表达式。你能解释一下它的具体作用和/或在哪里查找它吗?我假设"\\U" 处理大写,但我并没有真正得到"\\1"。谢谢!
  • \\1 是对第一个匹配模式的反向引用。这一切都在?gsub 的示例中,这是我查看的地方...
  • 在使用 R 时,答案很简单,只要你知道自己在做什么 =D。谢谢本博尔克!
  • 我喜欢这样的正则表达式解决方案;简单的。 +1 我自己也从这样的正则表达式解决方案中受益,尤其是当海报添加有关每件作品正在做什么的信息时。 Ben,如果不是太麻烦的话,您能否稍微解释一下每件作品对未来线程搜索者的作用?
【解决方案2】:

gsubfn package 中的gsubfn 类似于gsub,只是替换字符串可以是函数。在这里,我们匹配 _ 以及之后通过toupper 匹配的所有内容:

> library(gsubfn)
>
> gsubfn("_.*", toupper, x)
[1] "NYC_23DF"  "BOS_3_RB"  "mgh_3_3_F"

请注意,这种方法涉及一个特别简单的正则表达式。

【讨论】:

  • 不敢相信我还没有这个包
【解决方案3】:

使用base::strsplit的简单示例

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f", "a") 

myCap <- function(x) {
    out <- sapply(x, function(y) {
        temp <- unlist(strsplit(y, "_"))
        out <- temp[1]
        if (length(temp[-1])) {
            out <- paste(temp[1], paste(toupper(temp[-1]), 
                collapse="_"), sep="_") 
        }
        return(out)
    })
    out
}

> myCap(x)
   NYC_23df    BOS_3_rb   mgh_3_3_f           a 
 "NYC_23DF"  "BOS_3_RB" "mgh_3_3_F"         "a" 

使用stringr 包的示例

pkg <- "stringr"
if (!require(pkg, character.only=TRUE)) {
    install.packages(pkg)
    require(pkg, character.only=TRUE)   
}

myCap.2 <- function(x) {
    out <- sapply(x, function(y) {
        idx <- str_locate(y, "_")
        if (!all(is.na(idx[1,]))) {
            str_sub(y, idx[,1], nchar(y)) <- toupper(str_sub(y, idx[,1], nchar(y))) 
        }
        return(y)
    })
    out
}

> myCap.2(x)
   NYC_23df    BOS_3_rb   mgh_3_3_f           a 
 "NYC_23DF"  "BOS_3_RB" "mgh_3_3_F"         "a" 

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2011-08-03
    • 2013-10-29
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多