如何检测所有大写字母中的字符串并将其转换为start case

时间:2014-01-13 19:29:03

标签: regex string r

说我有以下的载体

x <- c('One', 'TWO', 'THREE / FOUR')

我想分别将TWOTHREE / FOUR转换为TwoThree / Four。我已经查看了casefold()和整个chartr()帮助页面,但无法弄清楚这一点。

在我真正的问题中,我有一个1500字符串的向量,我打算在其中检测以全部大写字母写的条目(我知道它们中的很多都包含斜线,就像上面示例中的斜杠一样)并将它们转换为start case

我可以做的一件事是运行grepl('^[A-Z]+$', x)(由tenub建议),但它没有检测到THREE / FOUR为全部大写(它产生[1] FALSE TRUE FALSE)。从我所看到的情况来看,只有空格的存在就足以让这个回归FALSE

删除锚点grepl('[A-Z]+$', x)(由TheGreatCO建议)适用于上面的示例,但在下一个示例中失败:

y <- "Imposto Territorial Rural - ITR"
grepl('[A-Z]+', y)
[1] TRUE

此外,无论我尝试什么,包含重音的元素总是被遗漏:

z <- c('Á')
grepl('[A-Z]+', z)
[1] FALSE

2 个答案:

答案 0 :(得分:5)

部分内容是包gsubfn中的演示示例。您可以在使用demo(gsubfn::gsubfn-lower)安装软件包后运行它。

x <- c('One', 'TWO', 'THREE / FOUR', 'ÁÁÁ')
library(gsubfn)
## find indices of vector where there are no lowercase letters 
## (therefore all letters must be uppercase)
idx <- grep("[[:lower:]]", x, invert = TRUE)
## in these indices, run tolower on characters 
## that do not follow a word boundary \\B
x[idx] <- gsubfn("\\B.", tolower, x[idx], perl = TRUE)
# [1] "One"          "Two"          "Three / Four" "Ááá"

\B[:lower:]都依赖于区域设置Sys.getlocale("LC_CTYPE")。我的是"English_United States.1252"。您的里程可能会有所不同。

答案 1 :(得分:-2)

我不太了解R,但我的答案基于gsub的描述以及in this document给出的正则表达式支持

gsub("([A-Z])([:alpha:]*)", paste(\1,tolower(\2),sep=""), x)

我不确定你是否必须用引号括起\ 1和\ 2,尝试它,如果它不起作用,请尝试使用\ 1和\ 2的引号