R 将大写单词转换为标题大小写

R 将大写单词转换为标题大小写,r,regex,R,Regex,我想改变这一点: input <- c("Théodore Agrippa d'AUBIGNÉ", "Vital d'AUDIGUIER DE LA MENOR") 形成两组,两侧有边界,如中所示 \b([A-Z])(\w+)\b 并对第二组使用tolower(第一组保持不变)。 请参阅(注意修饰符,尤其是u) 作为旁注:您仍然有几个问题(尚未接受)答案。检测所有大写字符并使用任何编码的一般答案是: input <- c("Théodore Agrippa d'AUBIGNÉ"

我想改变这一点:

input <- c("Théodore Agrippa d'AUBIGNÉ", "Vital d'AUDIGUIER DE LA MENOR")

形成两组,两侧有边界,如中所示

\b([A-Z])(\w+)\b
并对第二组使用
tolower
(第一组保持不变)。
请参阅(注意修饰符,尤其是
u



作为旁注:您仍然有几个问题(尚未接受)答案。

检测所有大写字符并使用任何编码的一般答案是:

input <- c("Théodore Agrippa d'AUBIGNÉ", "Vital d'AUDIGUIER DE LA MENOR", "Philippe Fabre d'ÉGLANTINE")
gsub("(*UCP)\\b(\\p{Lu})(\\p{Lu}+)\\b", "\\1\\L\\2", input, perl = TRUE)
# [1] "Théodore Agrippa d'Aubigné"    "Vital d'Audiguier De La Menor" "Philippe Fabre d'Églantine"

input这里有一个替代解决方案:

gsub("(?<=\\p{L})(\\p{L}+)", "\\L\\1", input, perl = TRUE)
gsub((?您也可以使用并特别设置
sep_in=“”
来不删除非字母数字,如
(默认值为
sep_in=“[^[:alnum:]”“
):

库(蛇壳)
输入[1]为真
由(v0.3.0)于2019-08-01创建

这是因为

  • snakecase将特殊字符视为单词,如果它们未通过
    sep\u在
    中指定为输入分隔符
  • snakecase::to_title_case()
    首先应用
    snakecase::to_station_case()
    以“”分隔单词,然后将(小写)结果包装在
    tools::toTitleCase()
    中,该结果不大写单独的“d”,即“d'aubigné”变为“d'aubigné”
  • snakecase始终“保护”其输出,即它清除非字母数字字符(此处
    )周围凌乱且可能不是预期的输出分隔符(此处“”)(对于数字字符,可通过
    数字
    参数调整行为)

  • 你与
    stringr::str_to_title(input)
    @Moody_Mudskipper问得好!(+1)似乎正在进行一些仇恨/报复投票。下面的答案也很好;一个完整的base R命令应该是
    gsub(\\b([a-Z])(\\w+\\b),“\\1\\L\\2”,input,perl=T)
    @Moody\u Mudskipper:不,不是。SO上最糟糕的事情之一是你可以在没有进一步解释的情况下投反对票。你可能因为没有表现出努力而被否决。这适用于新用户,就像对老用户一样。是的,除了“Adam de La Halle”,他们中的大多数都是“de La”。祝诗人好运:-)。你在说什么问题?你能评论一下吗?我有不止两个问题,但从我看来,我对这些问题的答案并不完全满意,否则我很乐意标记为已回答。谢谢你的回答,正如@Maurits评论一样,R命令应该是:
    gsub(\\b([a-Z])(\\w+\\b),“\\1\\L\\2”,input,perl=TRUE)
    @Moody\u Mudskipper:很高兴能帮上忙。老实说,我一直忘了
    \L
    这个东西。我喜欢它,因为只有一个组被替换了,它非常整洁易读。它不适用于一些理论上的边缘案例,例如:
    gsub(“(?@Moody_Mudskipper谢谢你的反馈,我做了第二次尝试。事实上,这几乎与Wiktor的答案一致,只是我使用了积极的回顾,而他使用了反向参照。
    
    input <- c("Théodore Agrippa d'AUBIGNÉ", "Vital d'AUDIGUIER DE LA MENOR", "Philippe Fabre d'ÉGLANTINE")
    gsub("(*UCP)\\b(\\p{Lu})(\\p{Lu}+)\\b", "\\1\\L\\2", input, perl = TRUE)
    # [1] "Théodore Agrippa d'Aubigné"    "Vital d'Audiguier De La Menor" "Philippe Fabre d'Églantine"
    
    gsub("(?<=\\p{L})(\\p{L}+)", "\\L\\1", input, perl = TRUE)
    
    gsub("(?<=\\b\\p{Lu})(\\p{Lu}+\\b)", "\\L\\1", input, perl = TRUE)