R:在某个角色之后大写一切

时间:2012-05-29 08:09:14

标签: regex r capitalization

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

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

应该是这样的:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

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

3 个答案:

答案 0 :(得分:22)

你非常接近:

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

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

将这一点分开:

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

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

答案 1 :(得分:12)

gsubfn package中的

gsubfngsub类似,但替换字符串可以是函数。在这里,我们匹配_和之后的所有内容,然后通过toupper

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

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

答案 2 :(得分:4)

使用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"