我有类似 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/