逗号后只保留每个单词的第一个字母

Keep only the first letter of each word after a comma

我有像 Sacher, Franz XaverNishikawa, Kiyoko 这样的字符串。

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

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

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

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

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') 

非常感谢您的帮助!

您可以使用

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

参见regex demo详情:

  • (*UCP) - PCRE 动词将使 \b 识别 Unicode
  • ^[^,]+(*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." 

拆分字符串的粗略方法:

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

一种使用多重反向引用的方法:

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): this, second, group 捕获名字的首字母
  • (\b\w):第三组捕获中间名的首字母