regex R:将某个字符后的所有字符大写

t3irkdon  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(182)

我想把字符向量中第一个_之后的所有字符都大写。

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

应该这样出来:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

我一直在尝试玩regular expressions,但我不能做到这一点。任何建议都将不胜感激。

oxf4rvwz

oxf4rvwz1#

你们非常接近:

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

看起来很有效。你只需要使用_.*(下划线后面跟着零个或多个其他字符)而不是_*(零个或多个下划线)...
进一步分析一下:

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

有关更多详细信息,请在?gsub中搜索“replacement”和“capitalizing”(有关正则表达式的一般信息,请在?regexp中搜索)

scyqe7ek

scyqe7ek2#

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

library(gsubfn)

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

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

5sxhfpxr

5sxhfpxr3#

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

相关问题