r - 逗号后只保留每个单词的第一个字母
问题描述
我有类似Sacher, Franz Xaver
or的字符串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')
我将不胜感激您的帮助!
解决方案
您可以使用
gsub("(*UCP)^[^,]+(*SKIP)(*F)|\\b(\\p{L})\\p{L}*", "\\U\\1.", TEST, perl=TRUE)
请参阅正则表达式演示。详情:
(*UCP)
- 使\b
Unicode 感知的 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."
推荐阅读
- go - 您如何为 golang 项目的 RPM 规范创建构建部分?
- javascript - 如何进行单元测试并检查函数是否在 Jest 中调用预期的 firebase 方法?
- linux - Docker:创建 aufs 挂载时出错,尽管 Ubuntu 19.01 可启动 USB 支持 aufs
- android - Android蓝牙应用程序将手机连接到智能扬声器全双工?
- windows - GetSystemIdForPublisher 不返回唯一 ID
- java - 使用复合键映射/访问实体
- r - 在 R 中生成满足约束的随机数
- python - Tkinter,创建带有滚动条的框架,以接收 arduino 串行
- python - 我有一个 3D numpy 数组。我想将它的切片变平,然后将其转回相同的 3D 阵列。我该怎么做?(python)
- javascript - 如何获取和存储选定的几何功能以在我的 Azure Maps 应用程序的其他功能中使用