r - 仅保留逗号后每个单词的第一个字母

标签 r regex gsub stringr

我有类似 Sacher, Franz Xaver 的字符串或Nishikawa, Kiyoko .

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

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

Here is a related response ,但它不能应用于我的情况 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." 

关于r - 仅保留逗号后每个单词的第一个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66637508/

相关文章:

r - 保持柱水恒定

rlattice - bwplot后水平abline的位置错误

regex - 在Powershell中获取2个字符之间的所有文本

javascript - 我应该使用 Xpath 还是 regexp 来实现此目的?

R - 反转 gsub : keep only matches with gsub argument

r - 在特定模式之前子集字符串的一部分

删除第一个和第二个下划线之前和之后的字符提取第一个和第二个下划线之间的字符串

r - R中避免嵌套ifelse语句的方法

r - 什么是二进制文件以及何时在 R 中使用 writeBin()

正则表达式:匹配单词中的 4 位数字