首页 > 解决方案 > 逗号后只保留每个单词的第一个字母

问题描述

我有类似Sacher, Franz Xaveror的字符串Nishikawa, Kiyoko

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

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

这是一个相关的响应,但它不能应用于我的案例 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') 

我将不胜感激您的帮助!

标签: rregexgsubstringr

解决方案


您可以使用

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

请参阅正则表达式演示详情

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

请参阅R 演示

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." 

推荐阅读