如何在保持首字母大写的同时仅将每个单词的首字母大写?
How to capitalize only the first letter of each word while keeping acronyms capitalized?
我正在编写一个函数来自动清理变量名以生成同质变量名。通常将 'This is anExample' 之类的内容转换为 'This.Is.An.Example'。通常所有这些都很容易,但是我在处理变量名称中包含的首字母缩略词时遇到了麻烦。
例如:"Clock in Time PST" 理想情况下会变成 "Clock.In.Time.PST"
我研究过将 str_to_upper 作为一个函数进行修改,但我对 C 语言没有任何应用知识,这似乎是编写 stringi 的背景。
我唯一的下一个想法是做一些有条件的检查,如果字符串没有 spaces 或标点符号,然后在大写字母前插入 space,因为前一个字母是小写字母。那是我唯一真正的想法如何潜在地处理它。
Example<-c("Easy Example Test",
"Medium..example TEst",
"HaRd exampleTEST",
"Truly HARd TestCase PST")
#Step 1 - Removes all punctuation replacing with spaces
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")
#Step 2 - This inserts a space wherever an uppercase letter is found with a preceding lowercase letter.
Example<-stringr::str_replace_all(Example,
"([[:lower:]](?=[[:upper:]])|[[:upper:]](?=[[:upper:]][[:lower:]]))",
"\1 ")
#Step 3 - This replaces all consecutive spaces with a period
Example<-stringr::str_replace_all(names(df), "\s{1,}", ".")
Current.Outcome<-c("Easy.Example.Test",
"Medium.example.T.Est",
"Ha.Rd.example.TEST",
"Truly.HA.Rd.Test.Case.PST")
Ideal.Outcome<-c("Easy.Example.Test",
"Medium.Example.Test",
"Hard.Example.Test",
"Truly.Hard.Test.Case.PST")
我花了一段时间找出最好的一般规则,使用正则表达式规则和字符串替换来解决这个问题。该解决方案不是很漂亮,但它在大多数情况下都有效,而且更准确的答案不会像我需要的那样笼统。下面是我的工作答案的另一个例子。
我尝试将正则表达式拆分为三个单独的 str_replace_all() 命令,但结果并不乐观,因此我们有这个庞大的正则表达式来执行所需的分组和匹配。
Example<-c("Easy Example Test",
"Medium..example TEst",
"Hard exampleTEST",
"Truly HARd TestCase PST",
"AnotherTESTof5FT2In",
"AnotherTESTof5FTT2In",
"ExampleOfCommonProblem")
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")
Example<-stringr::str_replace_all(Example,
"(([[:lower:]]|[[:digit:]]){1}(?=[[:upper:]])|[[:upper:]]{2,}(?=([[:lower:]]|[[:digit:]]))|([[:lower:]]){1,}(?=[[:digit:]]))",
"\1 ")
Example<-stringr::str_replace_all(Example, "\s{1,}", ".")
Example
下面是上面代码的控制台输出,它没有提供完美的答案,但解决了绝大多数测试用例。
> Example
[1] "Easy.Example.Test" "Medium.example.TE.st"
[3] "Hard.example.TEST" "Truly.HAR.d.Test.Case.PST"
[5] "Another.TEST.of.5.FT.2.In" "Another.TEST.of.5.FTT.2.In"
[7] "Example.Of.Common.Problem"
我正在编写一个函数来自动清理变量名以生成同质变量名。通常将 'This is anExample' 之类的内容转换为 'This.Is.An.Example'。通常所有这些都很容易,但是我在处理变量名称中包含的首字母缩略词时遇到了麻烦。
例如:"Clock in Time PST" 理想情况下会变成 "Clock.In.Time.PST"
我研究过将 str_to_upper 作为一个函数进行修改,但我对 C 语言没有任何应用知识,这似乎是编写 stringi 的背景。
我唯一的下一个想法是做一些有条件的检查,如果字符串没有 spaces 或标点符号,然后在大写字母前插入 space,因为前一个字母是小写字母。那是我唯一真正的想法如何潜在地处理它。
Example<-c("Easy Example Test",
"Medium..example TEst",
"HaRd exampleTEST",
"Truly HARd TestCase PST")
#Step 1 - Removes all punctuation replacing with spaces
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")
#Step 2 - This inserts a space wherever an uppercase letter is found with a preceding lowercase letter.
Example<-stringr::str_replace_all(Example,
"([[:lower:]](?=[[:upper:]])|[[:upper:]](?=[[:upper:]][[:lower:]]))",
"\1 ")
#Step 3 - This replaces all consecutive spaces with a period
Example<-stringr::str_replace_all(names(df), "\s{1,}", ".")
Current.Outcome<-c("Easy.Example.Test",
"Medium.example.T.Est",
"Ha.Rd.example.TEST",
"Truly.HA.Rd.Test.Case.PST")
Ideal.Outcome<-c("Easy.Example.Test",
"Medium.Example.Test",
"Hard.Example.Test",
"Truly.Hard.Test.Case.PST")
我花了一段时间找出最好的一般规则,使用正则表达式规则和字符串替换来解决这个问题。该解决方案不是很漂亮,但它在大多数情况下都有效,而且更准确的答案不会像我需要的那样笼统。下面是我的工作答案的另一个例子。
我尝试将正则表达式拆分为三个单独的 str_replace_all() 命令,但结果并不乐观,因此我们有这个庞大的正则表达式来执行所需的分组和匹配。
Example<-c("Easy Example Test",
"Medium..example TEst",
"Hard exampleTEST",
"Truly HARd TestCase PST",
"AnotherTESTof5FT2In",
"AnotherTESTof5FTT2In",
"ExampleOfCommonProblem")
Example<-stringr::str_replace_all(Example, "[[:punct:]]", " ")
Example<-stringr::str_replace_all(Example,
"(([[:lower:]]|[[:digit:]]){1}(?=[[:upper:]])|[[:upper:]]{2,}(?=([[:lower:]]|[[:digit:]]))|([[:lower:]]){1,}(?=[[:digit:]]))",
"\1 ")
Example<-stringr::str_replace_all(Example, "\s{1,}", ".")
Example
下面是上面代码的控制台输出,它没有提供完美的答案,但解决了绝大多数测试用例。
> Example
[1] "Easy.Example.Test" "Medium.example.TE.st"
[3] "Hard.example.TEST" "Truly.HAR.d.Test.Case.PST"
[5] "Another.TEST.of.5.FT.2.In" "Another.TEST.of.5.FTT.2.In"
[7] "Example.Of.Common.Problem"