gpt4 book ai didi

regex - 如何将字符串向量转换为标题大小写

转载 作者:行者123 更新时间:2023-12-02 01:53:45 28 4
gpt4 key购买 nike

我有一个小写字符串向量。我想将它们更改为标题大小写,这意味着每个单词的第一个字母都大写。我已经设法用双循环来做到这一点,但我希望有一种更高效、更优雅的方法来做到这一点,也许是带有 gsub 和正则表达式的单行代码。

这里有一些示例数据,以及有效的双循环,然后是我尝试过但不起作用的其他内容。

strings = c("first phrase", "another phrase to convert",
"and here's another one", "last-one")

# For each string in the strings vector, find the position of each
# instance of a space followed by a letter
matches = gregexpr("\\b[a-z]+", strings)

# For each string in the strings vector, convert the first letter
# of each word to upper case
for (i in 1:length(strings)) {

# Extract the position of each regex match for the string in row i
# of the strings vector.
match.positions = matches[[i]][1:length(matches[[i]])]

# Convert the letter in each match position to upper case
for (j in 1:length(match.positions)) {

substr(strings[i], match.positions[j], match.positions[j]) =
toupper(substr(strings[i], match.positions[j], match.positions[j]))
}
}

这可行,但看起来异常复杂。我只是在尝试了更直接的方法失败后才诉诸它。以下是我尝试过的一些操作以及输出:

# Google search suggested \\U might work, but evidently not in R
gsub("(\\b[a-z]+)", "\\U\\1" ,strings)
[1] "Ufirst Uphrase" "Uanother Uphrase Uto Uconvert"
[3] "Uand Uhere'Us Uanother Uone" "Ulast-Uone"

# I tried this on a lark, but to no avail
gsub("(\\b[a-z]+)", toupper("\\1"), strings)
[1] "first phrase" "another phrase to convert"
[3] "and here's another one" "last-one"

正则表达式捕获每个字符串中的正确位置,如调用 gregexpr 所示,但替换字符串显然无法按预期工作。

如果您还不知道,我对正则表达式相对较新,并且希望获得有关如何使替换项正常工作的帮助。我还想学习如何构造正则表达式,以避免捕获撇号后的字母,因为我不想更改这些字母的大小写。

最佳答案

主要问题是您缺少 perl=TRUE (并且您的正则表达式略有错误,尽管这可能是尝试解决第一个问题的结果)。

使用 [:lower:] 代替 [a-z] (或使用 [:alpha:] 代替 [A- Za-z]) 稍微安全一些,以防你的代码最终在一些奇怪的 ( sorry, Estonians ) 语言环境中运行,其中 z 不是字母表的最后一个字母 ...

re_from <- "\\b([[:alpha:]])([[:alpha:]]+)"
strings <- c("first phrase", "another phrase to convert",
"and here's another one", "last-one")
gsub(re_from, "\\U\\1\\L\\2" ,strings, perl=TRUE)
## [1] "First Phrase" "Another Phrase To Convert"
## [3] "And Here's Another One" "Last-One"

您可能更喜欢使用 \\E (停止大写)而不是 \\L (开始小写),具体取决于您要遵循的规则,例如:

string2 <- "using AIC for model selection"
gsub(re_from, "\\U\\1\\E\\2" ,string2, perl=TRUE)
## [1] "Using AIC For Model Selection"

关于regex - 如何将字符串向量转换为标题大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776732/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com