【问题标题】:Keep only the first letter of each word after a comma逗号后只保留每个单词的第一个字母
【发布时间】:2021-06-12 16:34:59
【问题描述】:

我有 Sacher, Franz Xaver 或 Nishikawa, Kiyoko 这样的字符串。

使用 R,我想将它们更改为 Sacher, F. X. 或 Nishikawa, K.。

换句话说,逗号后面的每个单词的第一个字母都应该保留一个点(如果后面有另一个单词,则保留一个空格)。

Here is a related response,但它不能应用于我的案例 1:1,因为它的字符串中没有逗号; (<?=, ) 的简单添加似乎不起作用。

例如在以下尝试中,gsub() 替换了所有内容,而我的 str_replace_all()-attempt 导致错误:

TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")

# first attempt
# (resembles the response from the other thread)
gsub('\\b(\\pL)\\pL{2,}|.','\\U\\1', TEST, perl = TRUE)

# second attempt
# error: "Incorrect unicode property"
stringr::str_replace_all(TEST, '(?<=, )\\b(\\pL)\\pL{2,}|.','\\U\\1') 

感谢您的帮助!

【问题讨论】:

    标签: r regex gsub stringr


    【解决方案1】:

    使用多个反向引用的方法:

    gsub("(\\b\\w+,\\s)(\\b\\w).*(\\b\\w)*", "\\1\\2.\\3", TEST)
    [1] "Sacher, F."    "Nishikawa, K." "Al-Assam, M." 
    

    这里,我们使用三个捕获组通过反向引用在gsub 的替换参数中进行引用:

    • (\\b\\w+,\\s):这个,首先,组捕获姓氏加上逗号,后跟空格
    • (\\b\\w):这,第二,组捕获名字的首字母
    • (\\b\\w):这个,第三,组捕获中间名的首字母

    【讨论】:

      【解决方案2】:

      一种粗略的分割字符串的方法:

      TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
      
      sapply(strsplit(TEST, '\\s+'), function(x) 
            paste0(x[1], paste0(substr(x[-1], 1, 1), collapse = '.'), '.'))
      
      #[1] "Sacher,F.X."  "Nishikawa,K." "Al-Assam,M." 
      

      【讨论】:

        【解决方案3】:

        你可以使用

        gsub("(*UCP)^[^,]+(*SKIP)(*F)|\\b(\\p{L})\\p{L}*", "\\U\\1.", TEST, perl=TRUE)
        

        请参阅regex demo。 详情:

        • (*UCP) - 使 \b 识别 Unicode 的 PCRE 动词
        • ^[^,]+(*SKIP)(*F) - 字符串开头,然后是逗号以外的任何零个或多个字符,然后匹配失败并跳过,下一个匹配从发生失败的位置开始
        • | - 或
        • \b - 字边界
        • (\p{L}) - 第 1 组:任何 Unicode 字母
        • \p{L}* - 零个或多个 Unicode 字母

        见R demo:

        TEST <- c("Sacher, Franz Xaver", "Nishikawa, Kiyoko", "Al-Assam, Muhammad")
        gsub("(*UCP)^[^,]+(*SKIP)(*F)|\\b(\\p{L})\\p{L}*", "\\U\\1.", TEST, perl=TRUE)
        ## => [1] "Sacher, F. X." "Nishikawa, K." "Al-Assam, M." 
        

        【讨论】:

        • 仅供参考:查看(*UCP)动词在this R demo中的重要性。
        猜你喜欢
        • 1970-01-01
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多